我正在为一个webapp构建一个node.js后端,当我提交一个表单时,我会进行各种验证。其中一个是检查是否已存在具有相同电子邮件地址的邀请。( isUserAlreadyInvited function)
我为此创建了一个函数,但是当我调用它时,我想响应不是那么快,它只是移动到下一个语句,即使检查返回true。怎么
//Loop through emails one by one
var emails_to_invite = ["test@test.com","invalid.com"];
var response_items = [];
async.each(emails_to_invite,
function(email, callback){
//Response item
var response_item = {}
response_item.email = email;
//Validate
if(Joi.validate({ email: email }, apiSchema).error) {
response_item.error = "not valid email";
response_items.push(response_item);
callback();
} else if(email == user.email) {
response_item.error = "Sending an invitation to your own email is kinda dumb";
response_items.push(response_item);
callback();
} else if(isUserAlreadyInvited(email,user_id)) {
response_item.error = "already invited";
response_items.push(response_item);
callback();
} else {
sendInvitationEmail(email,user_id,null,null,function(invitation_code){
if(invitation_code) {
response_item.invitationCode = invitation_code;
} else {
response_item.error = "server error";
}
response_items.push(response_item);
callback();
});
};
},
function(err){
//Return response
res.status(200).send(response_items);
}
);
function isUserAlreadyInvited(email,invited_by) {
User.findOne({
email: email,
invited_by: invited_by
}, function(err, user) {
if(err) {
return false;
} else {
return true;
}
});
}
答案 0 :(得分:0)
这里有两个回报:
function isUserAlreadyInvited(email,invited_by) {
User.findOne({
email: email,
invited_by: invited_by
}, function(err, user) {
if(err) {
return false;
} else {
return true;
}
});
}
在此函数中定义
function(err, user) {
if(err) {
return false;
} else {
return true;
}
}
并且没有任何返回值isUserAlreadyInvited()
。
显然你的isUserAlreadyInvited()是一个需要异步处理的异步函数 - 它应该将回调函数作为参数。应该调用该回调来代替function(err, user) {}