angular - 根据值从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);
}
解决方案
这是因为,通过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;
}
});
推荐阅读
- java - 如何使用 Jacoco 从覆盖分析中排除测试类
- python - 删除机器人等待使用 discord.py 的消息
- c# - 当调试器请求一个值时,如何判断我的断言是否被命中?
- matlab - Matlab - Chien Search 实现初始化
- azure - 使用PowerShell从Azure数据工厂中的管道中删除触发器引用
- azure-virtual-network - Azure 负载均衡器 - 无法访问端口,除非它在网络安全组中打开
- google-data-studio - 如何显示某个日期和上一个时间段之间的指标比较?
- sql - 检查表的任何行上的重叠日期 Oracle SQL
- android - Android 从 ListView 项中提取特定值
- ios - 当系统外观发生变化时,SwiftUI ButtonStyle 动画导致 UI 在 App Switcher 快照中不更新