How to check if usernames are unique in Firebase

旧时模样 提交于 2020-05-16 04:34:44

问题


I have a function (not finished yet) that should check if a username already exists/is unique in my Firebase database. I have searched Google on how to implement this and I have managed to get the below. Unfortunately, it doesn't work and I don't even get any console.logs. Any help is appreciated - what exactly am I doing wrong?

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

my database structure is as follows:

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

****Question Update **** After Comments from Frank, I have changed my code to the following. It still doesn't work, but my he has spotted a couple of errors that needed fixing:

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

and my database to the following:

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

回答1:


You're missing a comparison in your query:

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

I recommend btw inverting the data structure. If you want user names to be unique, use those as the keys in the parent node:

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

This way your lookups will be simpler and fast, since you don't need a query. In addition, the value will now allow you to easily look up more information on the user who claimed this user name.



来源:https://stackoverflow.com/questions/57616310/how-to-check-if-usernames-are-unique-in-firebase

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!