首页 > 解决方案 > 根据值从Angular中的firebase检索数据

问题描述

我在 firebase 中有一些数据(电子邮件 ID 和密码是关键)。我正在传递一个电子邮件 ID,并想检索相应的密码以检查验证。但是,当我尝试在控制台上打印检索到的值时,即使数据存在于 firebase 中,它也会打印“null”。

getPassword(email:string)
  {
    console.log(email);
    this.db.database.ref('/facility').orderByChild('email').equalTo(email).once('value', (snapshot) => {
      //console.log(snapshot.val());
      if(snapshot.val())
     { this.userpassword = snapshot.val().password;
      return this.userpassword;}
    })
   
  
  }

这是数据库结构

我尝试将电子邮件作为 akhilesh@snu.edu.in 传递,期望从数据库中收到“akhilesh”但收到空值。

 verifyuser(email: string){
  
    
    this.userService.getPassword(email);
  }
  

标签: angularfirebasefirebase-realtime-database

解决方案


这是因为,通过snapshot.val(),您收到“完整”对象,即

{ Akhilesh : {
    email: .....,
    password: .....
  }
}

正如您可能已经看到的那样console.log(snapshot.val());。事实上,您调用once()方法 on database.ref('/facility')


因此,以下方法可以解决问题:

var dataObj = snapshot.val();
var password = dataObj[Object.keys(dataObj)[0]].password;

请注意,如果您确定只有一个节点对应于电子邮件,则此解决方案将起作用。

如果不是这种情况,您将需要遍历快照,如下所示:

this.db.database.ref('/facility').orderByChild('email').equalTo(email).once('value', snapshot => {
  snapshot.forEach(childSnapshot => {
    var childData = childSnapshot.val();
    var password = childData.password;
  });
});

在下面回答您的评论:

您必须等待该once()方法返回的 Promises 解析then()为 ,如下所示:

return this.db.database.ref('/facility').orderByChild('email').equalTo(email)
  .once('value')
  .then(dataSnapshot => {
    if(snapshot.val()) {
       var dataObj = snapshot.val();
       var password = dataObj[Object.keys(dataObj)[0]].password;
       return password;
    }
  });

推荐阅读