当firebase查询与数据库中的任何内容都不匹配时如何调用函数

Posted

技术标签:

【中文标题】当firebase查询与数据库中的任何内容都不匹配时如何调用函数【英文标题】:How to call a function when firebase query doesn't match anything in the database 【发布时间】:2019-12-21 19:04:10 【问题描述】:

我正在尝试为 React Native 项目实现一个好友添加系统。我正在使用firebase实时数据库。问题是当我使用 'equalTo()' 函数进行查询时,如果数据库中没有匹配的数据,我没有得到结果,也无法调用函数来说明没有具有此用户名的用户.我想做的就是能够说没有找到使用该用户名的用户。

我使用 'child_added' 事件类型来获取与搜索到的用户名匹配的用户的用户 ID,但如果没有匹配的用户名,我的回调函数将永远不会被调用。如果我使用 'value' 事件类型,则 snapshot.key 返回字符串 'users' 并且 snapshot.val() 没有匹配用户的用户 ID(如果有的话)。

这是当前数据库:

"users": 
    "uid1": 
        "user_details": 
            "username": "username1"
       
    ,
    "uid2": 
        "user_details": 
            "username": "username2"
       
    

这是代码:

firebase.database().ref('users')
    .orderByChild('user_details/username')
    .equalTo(username)
    .once('child_added', snapshot => 
        console.log('User found');
    )
    .then(() => 
        console.log('No users found')
    );

用户名通过函数调用传递。

如果查询找不到等于用户名的结果,则永远不会执行 one() 或至少永远不会执行其第二个参数,那么也永远不会执行 then()。

我没有收到任何错误。

【问题讨论】:

【参考方案1】:

child_added 事件会针对与查询匹配的每个子节点触发。如果没有匹配查询的子节点,child_added 不会被触发。

要检测不存在任何匹配项,您需要监听 value 事件:

firebase.database().ref('users')
    .orderByChild('user_details/username')
    .equalTo(username)
    .once('value', snapshot => 
      if (!snapshot.exists()) 
        console.log('No users found')
      ;
    );

在这种情况下,您不妨也将肯定检测添加到value 侦听器,其中:

firebase.database().ref('users')
    .orderByChild('user_details/username')
    .equalTo(username)
    .once('value', snapshot => 
      if (!snapshot.exists()) 
        console.log('No users found')
      
      else 
        snapshot.forEach(child => 
          console.log('User found: '+child.key)
        );
      
    );

【讨论】:

非常感谢。它按应有的方式工作。我试过value 监听器,但我没能拿到钥匙。感谢您的回答,它终于奏效了,我理解了解决方案。【参考方案2】:

'child_added' 更改为'value' 以查询一次,有关更好的解释,请参阅@Frank 的答案

【讨论】:

以上是关于当firebase查询与数据库中的任何内容都不匹配时如何调用函数的主要内容,如果未能解决你的问题,请参考以下文章

Typescript 编译器错误 - 提供的参数与调用目标的任何签名都不匹配

当请求中的 nodeId 与数据库中的 nodeId 匹配时,我可以将 Firebase 实时数据库规则设置为只读吗

选择器“new-selector”与任何元素都不匹配

为什么我收到以下错误:“required(..)+ loop在输入Scenario中的任何内容都不匹配:”在我的功能文件中的Background部分之后?

git push 错误:src refspec main 与 linux 上的任何内容都不匹配

根据特定值查询子节点(Swift 3、Firebase)