Javascript 在给定用户电子邮件或其他任意字段的firebase实时数据库中查找表
我在实时firebase中存储了一个用户,其中包含关键uid用户id和字段:Javascript 在给定用户电子邮件或其他任意字段的firebase实时数据库中查找表,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我在实时firebase中存储了一个用户,其中包含关键uid用户id和字段: uid email emailVerfied 我想找到一封电子邮件中的用户记录。我目前的黑客技术还有很多需要改进的地方。特别是如何正确检索给定快照的实际用户记录: 我应该如何摆脱丑陋的循环黑客,它根本不需要工作?如果您有一个具有要筛选的值的子属性电子邮件,则可能有多个子节点与您筛选的值相匹配。这就是为什么你需要这个循环,所以我想说,这是工作的预期 执行循环的一种更惯用的方法是使用Firebase的内置forEach方
uid
email
emailVerfied
我想找到一封电子邮件中的用户记录。我目前的黑客技术还有很多需要改进的地方。特别是如何正确检索给定快照的实际用户记录:
我应该如何摆脱丑陋的循环黑客,它根本不需要工作?如果您有一个具有要筛选的值的子属性电子邮件,则可能有多个子节点与您筛选的值相匹配。这就是为什么你需要这个循环,所以我想说,这是工作的预期 执行循环的一种更惯用的方法是使用Firebase的内置forEach方法: 如果您知道只有一个匹配的子项,那么可以侦听child_added,它为每个子项激发。因此,oncechild_added将只为第一个孩子开火:
firebaseApp.database().ref('/users/')
.orderByChild('email')
.equalTo(user_email)
.once('child_added', snap => {
next(snap.val())
});
但是如果你的应用程序已经要求在所有用户下的邮件中唯一的邮件值,请考虑使用该值作为密钥。您需要对电子邮件地址进行编码,因为。在Firebase密钥中不允许将其编码为自定义。当您使用编码的电子邮件地址作为密钥时,可以执行如下直接查找:
firebaseApp.database().ref('/users/'+user_email)
.once('value', snap => {
const record = snap.val();
key = snap.key;
next(record)
});
由于最多有一个节点与此读取匹配,因此回调中不再需要循环
firebaseApp.database().ref('/users/')
.orderByChild('email')
.equalTo(user_email)
.once('child_added', snap => {
next(snap.val())
});
firebaseApp.database().ref('/users/'+user_email)
.once('value', snap => {
const record = snap.val();
key = snap.key;
next(record)
});