【问题标题】:Passing callback twice in single function in NodeJS在NodeJS的单个函数中两次传递回调
【发布时间】:2016-08-12 10:02:04
【问题描述】:

我创建了一个从 firebase 获取值的函数。现在,我存储 firebase 查询结果的变量只能在 firebase 操作中访问。但是我需要函数之外的这些变量,所以我创建了回调函数来克服这个问题。

我的代码如下所示: 我有两个 Firebase 数据库。 一种是存储注册用户(ref1),另一种是存储付费用户(paidRef)。我需要检查登录的用户是注册用户还是付费用户。

var paidRef=new Firebase("https://app.firebaseio.com/paidUsers");
var ref1=new Firebase("https://app.firebaseio.com/tempUser");

function checkPaidUsers(res,callback){

 ref1.orderByChild('userId').equalTo(jsonData.userId).once('child_added', function(snap) {

 registeredUser=true;
  paidRef.on('child_added',function(snapshot) {
   if(snapshot.child('userId').val()==jsonData.userId )
   {

      paidFlag=true;
      return callback(registeredUser,paidFlag,res);
   }
   else
   {

      paidFlag=false;
      return callback(registeredUser,paidFlag,res);
   }

 })

})
}
checkPaidUsers( res,function(registeredUser,paidFlag) {

  if(registeredUser!=true)
  {
     newUser=true;


  }
return res.send({paidFlag:paidFlag,registeredUser:registeredUser,newUser:newUser});})

此代码给出的错误如下:

Can't set headers after they are sent.

出现此错误是因为回调函数被调用的次数与否一样多。孩子的paidRef 有,因为如果在paidRef 数据库中找不到用户,它会转到 else 块并执行回调函数。 解决从单个回调函数获取注册用户和付费用户的所有信息的最佳方法是什么。

【问题讨论】:

  • 如果您使用ref1.orderByChild('userId').equalTo(jsonData.userId) 查询,为什么不将用户存储在他们的userId 下:/tempUsers/$uid。然后就可以轻松获取到你要找的用户ref1.child(jsonData.userId).once('value', function(snapshot) { console.log(snapshot.val()); })

标签: javascript node.js callback firebase


【解决方案1】:

您的问题是您为paidRef 中的每个用户调用一次回调,这似乎不是您的意图。
这段代码应该只调用一次回调。

var paidRef=new Firebase("https://app.firebaseio.com/paidUsers");
var ref1=new Firebase("https://app.firebaseio.com/tempUser");

function checkPaidUsers(res,callback){

 ref1.orderByChild('userId').equalTo(jsonData.userId).once('child_added', function(snap) {

 registeredUser=true;
  paidRef.child(jsonData.userId).once('value', function(snapshot) {
    var paidFlag = false;
    if (snapshot.val() !== null) {
      paidFlag = true;
    }
    callback(registeredUser, paidFlag, res)
  })
})
}
checkPaidUsers( res,function(registeredUser,paidFlag) {

  if(registeredUser!=true)
  {
     newUser=true;


  }
return res.send({paidFlag:paidFlag,registeredUser:registeredUser,newUser:newUser});})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    相关资源
    最近更新 更多