【问题标题】:Firebase's .once() Query Method Doesn't Stop Listening After Being Called [duplicate]Firebase 的 .once() 查询方法在被调用后不会停止监听 [重复]
【发布时间】:2016-02-09 11:24:19
【问题描述】:

我是一个全新的 Firebase 用户,正在尝试构建一个简单的应用程序 - 我遇到了一个奇怪的问题,我无法找到解决方案。

这就是我正在做的事情。

我有一个简单的 Firebase 用户数据库,看起来像这样:

{
  "users": {
    "randomlyAssignedId": {
      "phoneNumber": "+18882223333"
    }
  }
}

我的想法是为每个使用我的服务的用户创建一个用户对象(每个用户对象只包含一个phoneNumber 字段)。

我已经将它存储在 Firebase 中并且已经开始工作了。

现在,事情变得棘手了。我想编写一个查询,通过他们的phoneNumber 返回用户。因此,在阅读了 Firebase 文档后,我想到了以下内容:

var Firebase = require('firebase');
var users = new Firebase('https://demo.firebaseio.com/users');

users.orderByChild('phoneNumber').equalTo('+18882223333').limitToFirst(1).once('value', function(snapshot) {
  console.log('API call succeeded:', snapshot.val());
}, function(err) {
  console.log('Firebase returned an error:' err);
});

当我运行此代码示例时,用户对象已成功登录到控制台(它找到了匹配项,是的!),但是——回调永远不会结束。

根据 .once() 的 Firebase 文档:https://www.firebase.com/docs/web/api/query/once.html 成功(或错误回调)应该只触发一次。

这似乎没有发生:(

谁能告诉我这是期望的行为,还是我做错了什么?

谢谢!

【问题讨论】:

  • 你说“回调永远不会结束”是什么意思?我很确定回调会在记录后退出,所以可能还有其他你期望发生的事情,但事实并非如此。
  • 如果你在命令行上运行我有的示例应用程序(使用 Node),你会看到在console.log 语句触发后,脚本没有结束——它一直坐着在那里无限期地监听事件。
  • 嗯,好的。这确实更清楚。这是预期行为,请参阅stackoverflow.com/questions/18046639/…
  • 啊,这回答了我的问题。如果您将其发布为答案,我会接受=)
  • 我标记为重复,因为它是……重复。 :-)

标签: javascript node.js firebase


【解决方案1】:

我认为你所期待的只是有点偏离。

您的 .once() 调用中有 2 个函数:

.once("value",function(snapshot){
    ....
},function(err){
   console.log('Did not find a user in the database:');
   console.log(err);
})

但是,如果未找到数据,则不会使用您正在寻找可能的错误值的第二个函数。第二个功能是捕捉缺乏授权/许可。我认为您正在寻找这样的东西:

.once("value",function(snapshot){
    if(snapshot.val()){
       console.log('Found existing user by phoneNumber in database:');
       console.log(snapshot.val());
    }else{
       console.log('Did not find a user in the database:');
       console.log(err);
    }
},function(err){
   console.log('Not authorized');
   console.log(err)
})

如果在数据库中找不到您的数据(用户的电话号码),则 snapshot.val() 的结果将为空。如果您在 Firebase 上设置了身份验证规则并且在发出此请求时未满足这些规则,则第二个回调函数将仅包含一个 err 值。

您可以在此处阅读更多内容: https://www.firebase.com/docs/web/api/query/once.html

【讨论】:

  • 我更新了我的问题,使其更加明确。不过你是对的——我没有正确处理错误。然而,核心问题依然存在。如果我在命令行上运行这个独立脚本——在控制台记录一些语句之后,脚本永远不会“退出”。它只是挂在那里而没有停止进程。我的意思是我不应该不必要地process.exit(0) 脚本,因为.once() 应该只触发一次。
猜你喜欢
  • 2016-09-19
  • 2013-06-02
  • 2020-09-08
  • 2013-03-17
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
相关资源
最近更新 更多