我创建了一个函数来从 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.
出现此错误是因为回调函数被调用的次数与否一样多。的 child payRef 有,因为如果在paidRef 数据库中找不到用户,它就会转到 else block 并执行回调函数。 解决从单个回调函数获取注册用户和付费用户的所有信息的问题的最佳方法是什么。
最佳答案
您的问题是您为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});})
关于javascript - 在 NodeJS 中的单个函数中传递回调两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36731709/