I make a Vote App, now I try to check if the user already voted to current poll.
My problem I think is a callback function that not work in the time I want.
I try a lot of method and read a lot about the callback and synchronize functions, and still don't know how to fix this problem.
Now the code (all in same route post):
Here I find the poll that user 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`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
after I call to test function here:
**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
Now the user choose the options and vote, its enter to function and log the "return 1" (marked), but it's not enter to the IF (marked) and ofcurse to the else (makred)...what I do wrong?
EDIT: i try this method ,from the log it`s work but i have antoher error now: EDIT 2: SOLVED.this code:( Thanks all)
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