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

标签 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.

出现此错误是因为回调函数被调用的次数与否一样多。的 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/

相关文章:

javascript - 我可以自定义文本区域以允许我添加/删除特定的文本项吗?

node.js - 检测提供商是否使用 Passport.js 注销?

ios - 当我从 Scheme Url 启动应用程序时未调用 openUrl

javascript - 如何在同一个 javascript 命名空间中调用另一个函数?

javascript - jQuery - 检查字符串是否大于 4 个字符

javascript - 如何让socket.io只监听一个特定的路由?

node.js - 在多个集合中搜索 mongoose

javascript - 哪些文档描述了传递给 Express app.METHOD 回调参数的内容

javascript - JavaScript promise 如何执行其代码?

javascript - 默认情况下突出显示的选项卡