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

Javascript 如何检查Firebase中的用户名是否唯一,javascript,firebase,react-native,firebase-realtime-database,Javascript,Firebase,React Native,Firebase Realtime Database,我有一个函数尚未完成,它应该检查我的Firebase数据库中是否已经存在用户名/用户名是否唯一。我已经在谷歌上搜索了如何实现这一点,我已经设法得到了以下信息。不幸的是,它不工作,我甚至没有得到任何console.log。感谢您的帮助-我到底做错了什么 onChangeUsername = (event) => { var oldError = {...this.state.error}; firebase.database().ref().child("Usernames").ord

我有一个函数尚未完成,它应该检查我的Firebase数据库中是否已经存在用户名/用户名是否唯一。我已经在谷歌上搜索了如何实现这一点,我已经设法得到了以下信息。不幸的是,它不工作,我甚至没有得到任何console.log。感谢您的帮助-我到底做错了什么

 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 })
}
****问题更新**** 在Frank发表评论之后,我将代码更改为以下内容。它仍然不起作用,但我的he发现了几个需要修复的错误:

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 })
  }

查询中缺少比较:

firebase.database().ref().child("Usernames").equalTo("Username1").orderByValue()
顺便说一句,我建议反转数据结构。如果希望用户名唯一,请将其用作父节点中的键:

Database:{ 
  Usernames: {
    Username1: uidOfUserWithUsername1, 
    Username2: uidOfUserWithUsername2 
  }
}

这样,您的查找将更加简单和快速,因为您不需要查询。此外,该值现在允许您轻松查找有关声称使用此用户名的用户的更多信息。

您的查询中缺少比较:

firebase.database().ref().child("Usernames").equalTo("Username1").orderByValue()
顺便说一句,我建议反转数据结构。如果希望用户名唯一,请将其用作父节点中的键:

Database:{ 
  Usernames: {
    Username1: uidOfUserWithUsername1, 
    Username2: uidOfUserWithUsername2 
  }
}

这样,您的查找将更加简单和快速,因为您不需要查询。此外,该值现在允许您轻松查找有关声称使用此用户名的用户的更多信息。

我已经在其中添加了equalToUsername1,但在尝试新事物时必须将其删除。添加equalTo对我来说没有任何改变。我将按照建议反转我的数据库。请不要更新您的问题,使其与现有的回答不匹配。可以随意进行编辑,但要确保现有的回复、评论和答案保持有效。否则,未来的读者将不知道如何理解此页面。请注意,由于代码不同,不改变任何内容的可能性很小。在调试器中单步执行代码时,最好能准确地知道哪一行没有达到预期效果。谢谢您的评论。所以在输出方面,两个控制台都没有记录任何输出,也就是说,它没有到达那些行。然而,函数被调用。我将试图澄清这个问题,以便对未来的读者也有意义。您可能希望在once中添加一个捕获,以查看在这种情况下是否存在安全错误。如果您与数据库有连接,则应始终调用then或catch of a once。我已经在其中安装了equalToUsername1,但在尝试新事物时必须将其删除。添加equalTo对我来说没有任何改变。我将按照建议反转我的数据库。请不要更新您的问题,使其与现有的回答不匹配。可以随意进行编辑,但要确保现有的回复、评论和答案保持有效。否则,未来的读者将不知道如何理解此页面。请注意,由于代码不同,不改变任何内容的可能性很小。在调试器中单步执行代码时,最好能准确地知道哪一行没有达到预期效果。谢谢您的评论。所以在输出方面,两个控制台都没有记录任何输出,也就是说,它没有到达那些行。然而,函数被调用。我将试图澄清这个问题,以便对未来的读者也有意义。您可能希望在once中添加一个捕获,以查看在这种情况下是否存在安全错误。如果您与数据库有连接,则应始终调用then或once的catch。