如何检查用户名在Firebase中是否唯一

Har*_*tta 1 javascript firebase react-native firebase-realtime-database

我有一个函数(尚未完成),该函数应检查用户名在Firebase数据库中是否已经存在/唯一。我在Google上搜索了如何实施此方法,并设法获得了以下信息。不幸的是,它不起作用,我什至没有任何console.logs。感谢您的帮助-我到底在做什么错?

 onChangeUsername = (event) => {

var oldError = {...this.state.error};

firebase.database().ref().child("Usernames").orderByValue().once('value', (snapshot) => {
  var exists = (snapshot.val() !== null);
  console.log(exists);
  console.log("hello");
});


if(this.state.validation.username.unique===true)
{oldError.username = "This username is already taken"}

else if((event.nativeEvent.text.length<this.state.validation.username.min) || (event.nativeEvent.text.length>this.state.validation.username.max) )
{oldError.username = "Username should be between " + this.state.validation.username.min + " and " + this.state.validation.username.max + " characters" ;}


else oldError.username = "";



this.setState({ username: event.nativeEvent.text, error:oldError })
}
Run Code Online (Sandbox Code Playgroud)

我的数据库结构如下:

Database:{ Usernames: {uid1: username1, uid2: username2}}
Run Code Online (Sandbox Code Playgroud)

****问题更新****在弗兰克发表评论后,我将代码更改为以下内容。它仍然不起作用,但是我发现了一些需要修复的错误:

onChangeUsername = (event) => {

    var oldError = {...this.state.error};

    firebase.database().ref().child("Usernames").orderByKey().equalTo("Username1").once('value', (snapshot) => {
      var exists = (snapshot.val() !== null);
      console.log(exists);
      console.log("hello");
    });


    if(this.state.validation.username.unique===true)
    {oldError.username = "This username is already taken"}

    else if((event.nativeEvent.text.length<this.state.validation.username.min) || (event.nativeEvent.text.length>this.state.validation.username.max) )
    {oldError.username = "Username should be between " + this.state.validation.username.min + " and " + this.state.validation.username.max + " characters" ;}


    else oldError.username = "";



    this.setState({ username: event.nativeEvent.text, error:oldError })
  }
Run Code Online (Sandbox Code Playgroud)

和我的数据库到以下:

Database:{ Usernames: {Username1: uid1, Username2: uid2}}
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 5

您在查询中缺少比较:

firebase.database().ref().child("Usernames").equalTo("Username1").orderByValue()
Run Code Online (Sandbox Code Playgroud)

我建议顺便说一句反转数据结构。如果希望用户名唯一,请使用这些作为父节点中的键:

Database:{ 
  Usernames: {
    Username1: uidOfUserWithUsername1, 
    Username2: uidOfUserWithUsername2 
  }
}
Run Code Online (Sandbox Code Playgroud)

这样,您的查询将变得更加简单和快捷,因为您不需要查询。此外,该值现在使您可以轻松查找有关声明该用户名的用户的更多信息。