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

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

我有一个函数(尚未完成)应该检查用户名在我的 Firebase 数据库中是否已经存在/是否唯一。我在谷歌上搜索了如何实现这个,我已经设法得到以下内容。不幸的是,它不起作用,我什至没有得到任何 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}}

最佳答案

您在查询中缺少比较:

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

顺便说一句,我建议反转数据结构。如果您希望用户名是唯一的,请将它们用作父节点中的键:

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

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

关于javascript - 如何检查用户名在 Firebase 中是否唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57616310/

相关文章:

javascript - JQuery - 获取当前单元格正上方单元格的值

c# - 将对象发送到 C# 中的 Javascript 函数

javascript - 在 View 更改之前, Angular 值不会反射(reflect)在范围中

node.js - Firebase 3.3.x Nodejs - createUserWithEmailAndPassword 不是函数

javascript - Firebase云函数不返回值,返回数据始终为null

javascript - 无法读取未定义的属性 'containerColor'(制作 react 性自定义组件)

javascript - AngularJS - 窗口警报加载

javascript - WordPress 中无冲突的 jQuery 范围

react-native - 在 React Native 中使用 FlatList 上的数组索引

javascript - 为什么在 fetch promise 和 this.setState 之后打印控制台日志,当我单击按钮时