Firebase的.once()查询方法在被调用后不会停止聆听

时间:2015-11-08 20:18:24

标签: javascript node.js firebase

我是全新的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,成功(或错误回调)应该只触发一次。

这似乎没有发生:(

有人能告诉我这是不是想要的行为,还是我做错了什么?

谢谢! < 3

1 个答案:

答案 0 :(得分: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()的结果将为null。如果您在firebase上设置了auth规则并且在发出此请求时未满足它们,则第二个回调函数将仅包含错误值。

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