使用firebase创建唯一用户名(React/Javascript)

使用firebase创建唯一用户名(React/Javascript),javascript,reactjs,firebase,firebase-authentication,Javascript,Reactjs,Firebase,Firebase Authentication,我试图做的是使用Firebase身份验证创建新用户,并在Firestore中创建他们自己的文档条目。到目前为止,一切都进展顺利,直到我想要创建独特的usersname。做这件事的最佳方式是什么?我是否应该创建一个包含所有用户的数组,以便在每次注册时进行交叉引用,或者创建一个专用于用户名的集合,并附上他们的电子邮件(您可以在第二次调用Firebase时看到这一点) Firebase auth只接收电子邮件和密码,所以这是不可能的,或者至少从我收集的信息来看是不可能的 export const si

我试图做的是使用Firebase身份验证创建新用户,并在Firestore中创建他们自己的文档条目。到目前为止,一切都进展顺利,直到我想要创建独特的usersname。做这件事的最佳方式是什么?我是否应该创建一个包含所有用户的数组,以便在每次注册时进行交叉引用,或者创建一个专用于用户名的集合,并附上他们的电子邮件(您可以在第二次调用Firebase时看到这一点)

Firebase auth只接收电子邮件和密码,所以这是不可能的,或者至少从我收集的信息来看是不可能的

export const signInUser = async ({ name, email, password }) => {
  try {
    await firebase
      .auth()
      .createUserWithEmailAndPassword(email, password)
      .then(cred => {
        return firebase
          .firestore()
          .collection("users")
          .doc(cred.user.uid)
          .set({
            name: name,
            email: email,
            friends: []
          });
      });
    await firebase
      .firestore()
      .collection("usernames")
      .doc(name)
      .set({ username: name, email: email });
    firebase.auth().currentUser.updateProfile({
      displayName: name
    });

    return {};
  } catch (error) {
    switch (error.code) {
      case "auth/email-already-in-use":
        return {
          error: "E-mail already in use."
        };
      case "auth/invalid-email":
        return {
          error: "Invalid e-mail address format."
        };
      case "auth/weak-password":
        return {
          error: "Password is too weak."
        };
      case "auth/too-many-requests":
        return {
          error: "Too many request. Try again in a minute."
        };
      default:
        return {
          error: "Check your internet connection."
        };
    }
  }
};

我将跳过这里的“用户名”集合,因为您基本上是在创建索引,fireStore已经为您创建了索引。要检查名称是否唯一,可以执行以下操作:

const snapshot=wait firestore.collection(“users”).where(“name”,“name=”,name).get();
//如果snapshot.empty为false,则获取该名称。

“我想创建唯一的用户名。最理想的方法是什么?”您已经尝试了什么?你在这方面遇到了什么问题?还可以看到很多关于这个主题的问题,比如:@FrankvanPuffelen我正要使用snapshot.empty方法来实现我的结果,但是由于你提到它可能被恶意用户滥用,正如你之前所说的,我选择了不太正确的方法。谢谢,我将使用Peter O链接的反向映射方法。为了确保只有一个用户可以声明一个名称,您需要一个事务。即使这样,恶意用户也可以绕过该代码,为所欲为,因为您无法使用安全规则防止重复值。这就是为什么其他答案使用名称作为识别文档的关键。由于密钥根据定义是唯一的,这会自动防止重复的用户名,并且可以使用安全规则进行保护。