您如何从逻辑上验证Firebase'child_added'数据是否存在并提供处理逻辑?

时间:2019-04-25 18:28:47

标签: javascript firebase firebase-realtime-database

我有逻辑,需要在查找现有子节点时进行检查。如果找到了该节点,则需要引用该密钥等。如果找不到,则需要以编程方式执行其他操作。我已经读过其他文章,说使用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);
});

1 个答案:

答案 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只会在后台检索一次数据,因此对同一数据使用多个侦听器不会有任何惩罚。