Firebase Angularfire2检查数据库中是否存在用户

时间:2016-07-17 14:57:32

标签: angular firebase firebase-realtime-database angularfire2

我有一个包含2个对象的数据库。它看起来像这样:

#include<stdio.h>

int main(){
printf("int\t%ld\n",sizeof(int*));
printf("char\t%ld\n",sizeof(char*));
printf("void\t%ld\n",sizeof(void*));
printf("float\t%ld\n",sizeof(float*));
}

OP :
int     8
char    8
void    8
float   8

现在我正在检查数据库中是否存在用户

users
    - KEY
        login: "xexe"
        password: "123"

    - KEY
        login: "dede"
        password: "123"

问题是什么?

让我们尝试使用&#34; dede&#34;注册用户登录(用户应该存在)

第一次点击提交按钮时,控制台会显示: 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"); } }) } - &gt;嗯,这很好。

问题是当我第二次点击提交时(没有刷新网页)

然后console.log向我显示了两条消息

Users exists

这将为新用户添加不应该做的事情。为什么第二次订阅函数遍历每一行?如何解决?

1 个答案:

答案 0 :(得分:9)

您可以将数据结构化为使用login KEY属性,而不是使用查询。

{
  "users": {
    "dede": {
      "login": "dede",
      "password": "Do not store passwords :)"
    },
    "xexe": {
      "login": "xexe"
    }
  }
}

现在,您可以创建对此位置的引用,并检查该对象是否存在。

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