为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2021-04-30 16:17:25
我有逻辑,需要在查找现有子节点时进行检查。如果找到了该节点,则需要引用该密钥等。如果找不到,则需要以编程方式执行其他操作。我已经读过其他文章,说使用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 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

just不能确定是否没有数据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仅在幕后检索一次数据,因此对同一数据使用多个侦听器不会有任何损失。


查看完整回答
反对 回复 2021-05-13
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信