问题与callback函数 – javascript / node.js

我做了一个投票应用程序,现在我试着检查用户是否已经投票给当前的投票。 我我的问题是一个callback函数,不能在我想要的时间工作。 我尝试了很多方法,并且读了很多关于callback函数和同步函数,但仍然不知道如何解决这个问题。
现在代码(全部在相同的路线后):

在这里我find用户投票的民意调查:

Poll.findById(req.params.id,function(err, poll){ //Find the Poll if(err){ console.log("Vote(find the Poll) post err"); } var test = function(poll,req){ //check if user already vote to the poll if(req.user.local){//if it`s auth user console.log("test"); User.findById(req.user._id,function(err, userFound){ if(err){ console.log("[checkVoted] Error findById"); } for(var i=0;i<userFound.local.vote.poll_voted.length;i++){//run on poll_voted array console.log("test for"); if(poll._id == userFound.local.vote.poll_voted[i]){ console.log("**return 1**"); return 1;//User already voted to this poll } }//end for console.log("test return 0"); return 0;//user not voted });//end user find } else{ //anonmey user console.log("[checkVoted] ELSE!"); return false; }//else end };//function end 

我打电话来testingfunction后:

  **if(test(poll,req))**{ //If user already voted, redirect console.log("already vote"); res.redirect("/poll/"+poll._id); }**else**{//User not voted. console.log("test Else not voted"); User.findById(req.user._id, function(err, user) {//find the id and save in voted poll if(err){ console.log("[VOTE>POST>User.findByID ERROR"); } else{ user.local.vote.poll_voted.push(poll._id); user.save(function(err){ if(err){ console.log("save user._id in poll_voted ERORR"); }}); }});//end User.findById var options = poll.options; var optionIndex = _.findIndex(options,["id", req.params.option_id]); poll.options[optionIndex].vote++; poll.save(function(err){ if(err){ console.log("save vote error"); } else{ res.redirect("/poll/"+poll._id); } }); }//end of else });//end of Poll findById 

现在用户select选项和投票,它的inputfunction和日志的“返回1”(标记),但它没有进入到IF(标记)和对其他(makred)的干扰…我做错了什么?

编辑:我尝试这种方法,从日志它的工作,但我现在antoher错误: 编辑2: SOLVED.this代码:(感谢所有)

 router.post("/poll/:id/:option_id", function(req, res){ Poll.findById(req.params.id,function(err, poll){ //Find the Poll if(err){ console.log("Vote(find the Poll) post err"); } var test = function(poll,req, callback){ var flag=0; if(req.user.local){//if it`s auth user console.log("test"); User.findById(req.user._id,function(err, userFound){//look for id user if(err){ console.log("[checkVoted] Error findById"); } for(var i=0;i<userFound.local.vote.poll_voted.length;i++){//runnig on poll_voted array console.log("test for"); if(poll._id == userFound.local.vote.poll_voted[i]){ console.log("**return 1**"); flag=1;//User already voted to this poll } }{//end for console.log("test return 0"); callback(flag); }});//end user find }//end if auth user };//test function end test(poll, req, function(param){ if(param){ console.log("already vote"); res.redirect("/poll/"+poll._id); } else{ console.log("test Else not voted"); User.findById(req.user._id, function(err, user) {//find the id and save in voted poll console.log("user findbyid succes"); if(err){ console.log("[VOTE>POST>User.findByID ERROR"); } else{ console.log("user findbyid succes else"); user.local.vote.poll_voted.push(poll._id); user.save(function(err){ if(err){ console.log("save user._id in poll_voted ERORR"); }}); }});//end User.findById console.log("user save the vote start"); var options = poll.options; var optionIndex = _.findIndex(options,["id", req.params.option_id]); poll.options[optionIndex].vote++; poll.save(function(err){ if(err){ console.log("save vote error"); } else{ console.log("user save the vote finsh"); res.redirect("/poll/"+poll._id); }}); }}); }); }); Error: Can't set headers after they are sent 

test(poll,req)是一个synchornous函数,但里面有一个到User.findById(req.user)函数的asynchronous引用。 一种select是传递callback函数


     test(poll,req,function(param){
        处理来自callback的返回值
         ....如果案例validation
     })

然后调用它


     var test = function(poll,req,cb){  
         User.findById(req.user._id,function(err,userFound){
            如果(ERR){
                 console.log(“[checkVoted] Error findById”);
             }
             ... for循环
             CB(PARAM)
         }
     }