在NodeJS中的单个函数中传递两次回调

时间:2016-04-20 00:22:14

标签: javascript node.js callback firebase

我创建了一个从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.

此错误即将发生,因为回调函数的调用次数为no。 payRef的子项是因为如果在paidRef数据库中找不到用户,则转到else块并执行回调函数。 什么是最好的方法来解决从单个回调函数获取注册用户和付费用户的所有信息的问题。

1 个答案:

答案 0 :(得分:3)

您的问题是,您正在为paidRef中的每个用户拨打一次回拨,这似乎不是您的意图。
此代码应仅调用一次回调。

import re

details = '(2,5  cr / K / M)'
pattern = re.compile(r'^\(([0-9],[0-9]).*/\s([A-Z])\s/\s([A-Z])\)')
m = pattern.match(details)

credit = m.group(1)
state = m.group(2)
grade = m.group(3)

course = {'credit': credit, 'state': state, 'grade': grade}

print course