【问题标题】:How do I check for unique user name in firebase using react native? [duplicate]如何使用本机反应检查 Firebase 中的唯一用户名? [复制]
【发布时间】:2021-09-16 03:53:08
【问题描述】:

我有一个简单的应用程序,用户可以在其中使用电子邮件和密码进行注册,然后他们可以更改他们的用户名。这是我的onSignUp 方法:

onSignUp() {
    const { email, password, userName } = this.state;

    this.validate({
      userName: { minlength: 3, maxlength: 20, required: true },
      email: { email: true, required: true },
      password: { minlength: 5, required: true },
    });
    firebase
      .auth()
      .createUserWithEmailAndPassword(email, password)
      .then((result) => {
        firebase
          .firestore()
          .collection("users")
          .doc(firebase.auth().currentUser.uid)
          .set({
            email,
            username,
          });
      })
      .catch((error) => {
        this.setState({ error: error.message });
      });
  }

稍后,我想给用户机会更改他们的userName。如何强制执行唯一的userNames?我能想到的一种方法是首先在firebase上执行查询以检查是否存在这样的用户名?这是正确的方法吗?另一种方式(我读过,但我不完全理解)是执行firebase规则?如果是这样,我如何创建新规则以及如何设置唯一用户名?还是我应该双向进行?

【问题讨论】:

  • 这已经在 Stack Overflow 上讨论过很多次了:确保字段唯一性的唯一方法是使用该字段作为集合中文档的 ID。因此,如果您想要唯一的用户名,则需要有一个集合(通常是一个附加集合),您可以在其中存储以用户名作为 ID 的文档。我建议您学习一些these,而不是再次重新发布相同的解决方案,如果您在自己的代码中尝试了那里的解决方案,请回帖。

标签: reactjs firebase react-native google-cloud-firestore


【解决方案1】:

你可以试试这个功能:

const usersColRef = firebase.firestore().collection("users")

async function isUsernameUnique (username) {
  try {
    const nameDoc = await usersColRef.where("username", "==", username).get()
    return !nameDoc.exists
  } catch (e) {
    console.log(e)
    return false
  }
}

// Use it as follows (make sure this is in an async function)
if (await isUsernameUnique("myCoolName")) {
  //proceed
} else {
  alert("Name is already taken. Show some more creativity ;)")
}

我建议存储一个名为“nameLower”的单独字段,然后在where() 查询中以小写形式传递输入的用户名,因为它区分大小写,即.where("nameLower", "==", username.toLowerCase())

【讨论】:

  • 虽然这确实会检查具有特定用户名的文档是否存在,但它并不能保证唯一性。恶意用户可能没有运行此代码,因此可以创建他们想要的任何用户名。确保唯一性的唯一方法是使用用户名作为集合中文档的 ID,然后在安全规则中拒绝未经授权的用户的覆盖。
猜你喜欢
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多