Я делаю приложение Vote, теперь я пытаюсь проверить, проголосовал ли пользователь за текущий опрос. Моя проблема, я думаю, является функцией обратного вызова, которая не работает в то время, которое я хочу. Я пробую много методов и много читаю о функции обратного вызова и синхронизации, и до сих пор не знаю, как исправить эту проблему.
Теперь код (все в одном маршруте):
Здесь я нахожу опрос, который голосовал пользователь:
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 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
после вызова функции тестирования здесь:
**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
Теперь пользователь выбирает параметры и голосует, его вводит функцию и записывает "возврат 1" (помечен), но он не входит в IF (помечен) и ofcurse в else (makred)... что я делаю неправильно?
EDIT: я пробую этот метод, из журнала это работает, но у меня есть antoher ошибка сейчас: EDIT 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 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) является синхронной функцией, но внутри нее существует асинхронная ссылка на функцию User.findById(req.user). Один из вариантов - передать функцию обратного вызова
test(poll,req, function(param){ ... process return values from callback .... if case validations })
и назовите его
var test = function(poll,req, cb){ User.findById(req.user._id,function(err, userFound){ if(err){ console.log("[checkVoted] Error findById"); } ...for loop cb(param) } }