当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 实时数据库规则设置为只读吗
为什么我收到以下错误:“required(..)+ loop在输入Scenario中的任何内容都不匹配:”在我的功能文件中的Background部分之后?