I have a database with 2 objects. It looks like this:
users
    - KEY
        login: "xexe"
        password: "123"
    - KEY
        login: "dede"
        password: "123"
Now I'm checking if user exists in the database
  constructor(private af: AngularFire) {
    this.users = af.database.list('/users');
  }
  registerUser(login: string, password: string) {
    this.af.database.list('/users', {
      query: {
        orderByChild: 'login',
        equalTo: login
      }
    }).subscribe(response => {
      if(response.length === 0) {
        console.log("User does not exist");
        //here i will add a user
      } else {
        console.log("Users exists");
      }
    })
  }
What's the problem?
Let's try to register a user with "dede" login (user should exists)
When I click a submit button first time, the console shows:
Users exists -> well, that's good.
The problem is when I click the submit the second time (without refreshing webpage)
Then console.log shows me two messages
User does not exist
User exists
and that would add a new user what shouldn't be done. Why the second time the subscribe function iterate through every row? How to fix it?
Rather than use a query, you can structure your data to use the login property as they KEY.
{
  "users": {
    "dede": {
      "login": "dede",
      "password": "Do not store passwords :)"
    },
    "xexe": {
      "login": "xexe"
    }
  }
}
Now you can create a reference to this location and check if the object exists.
registerUser(login: string, password: string) {
  const user = this.af.database.object(`users/${login}`);
  user.subscribe(data => {
    if(data.$value !== null) {
      console.log('User does not exist');
    } else {
      console.log('User does exist');
    }
  });
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With