我有逻辑,需要在查找现有子节点时进行检查。如果找到了该节点,则需要引用该密钥等。如果找不到,则需要以编程方式执行其他操作。我已经读过其他文章,说使用snap.exists()来确定这个……我在下面的代码中尝试过。但是由于某些原因,该代码会跳过此引用,并且不会运行内部逻辑。
如果我将“ child_added”更改为“ value”,它将运行存在的代码,但是它不包含我从子节点中需要的snap.key值。
必须有简单的方法对此进行编码吗?
firebase.database().ref('users').child(props.currentUser.uid).child('traits').orderByChild('field').equalTo(traitName).once('child_added', snap => {
if (snap.exists())
{
console.log('found');
}
else{
console.log('did not find');
}
}).then(() => {
runprocess(traitName, traitValue);
});
答案 0 :(得分:0)
仅凭child_*
无法确定是否没有数据,您将需要一个value
侦听器。
要处理value
事件获得的多个子代,可以使用:
firebase.database().ref('users').child(props.currentUser.uid).child('traits').orderByChild('field').equalTo(traitName).once('value', snapshot => {
if (snap.exists()) {
console.log('found');
snapshot.forEach(function(child) {
console.log(child.key);
})
}
else{
console.log('did not find any children');
}
})
如果您只在乎是否有一个孩子,而又不需要其他孩子,则可以将查询限制为一个结果:
firebase.database().ref('users')
.child(props.currentUser.uid).child('traits')
.orderByChild('field').equalTo(traitName)
.limitToFirst(1)
.once('value', snapshot => {
但是您仍然需要在这里进行forEach
调用,因为API不知道只会有结果-或至少在这种情况下没有重载。
您还可以合并child_*
和value
事件。 Firebase只会在后台检索一次数据,因此对同一数据使用多个侦听器不会有任何惩罚。