【问题标题】:How to check if usernames are unique in Firebase如何检查用户名在 Firebase 中是否唯一
【发布时间】:2019-12-28 04:33:09
【问题描述】:

我有一个函数(尚未完成),它应该检查用户名在我的 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 })
}

我的数据库结构如下:

Database:{ Usernames: {uid1: username1, uid2: username2}}

****问题更新**** 在 Frank 发表评论后,我已将代码更改为以下内容。它仍然不起作用,但我的他发现了几个需要修复的错误:

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

我的数据库如下:

Database:{ Usernames: {Username1: uid1, Username2: uid2}}

【问题讨论】:

    标签: javascript firebase react-native firebase-realtime-database


    【解决方案1】:

    您的查询中缺少比较:

    firebase.database().ref().child("Usernames").equalTo("Username1").orderByValue()
    

    我建议顺便颠倒数据结构。如果您希望用户名是唯一的,请将其用作父节点中的键:

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

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

    【讨论】:

    • 我已经有 equalTo("Username1") 了,但在尝试新事物的过程中必须删除它。添加 equalTo 对我来说没有任何改变。不过,我会按照建议反转我的数据库。
    • 请不要更新您的问题以与现有回复不匹配。随意进行编辑,但确保现有响应(cmets、answers)保持有效。否则未来的读者将不知道如何理解这个页面。
    • 请注意,“不改变任何东西”是不太可能的,因为代码不同。在这一点上,当您在调试器中单步执行代码时,最好确切地知道哪一行没有按照您的预期执行。
    • 感谢您的 cmets 弗兰克。因此,就输出而言,控制台日志都没有输出任何内容,即它没有到达那些行。然而,该函数被调用。我将尝试澄清这个问题,以便对未来的读者也有意义。
    • 您可能希望将catch 添加到once,以查看在这种情况下是否存在(安全)错误。如果您连接到数据库,则应始终调用once()then()catch()
    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2019-01-04
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多