我试图创建一个方法,我可以从我的快递应用程序的所有部分调用,我只是将值传递给此方法,它使用moongose搜索mongodb以查看用户是否存在,然后它返回一个布尔值作为结果。
function findUserExists(name){
User.findOne({ "name": name }, function(err, user) {
if (user){
console.log("user exits");
return true;
}
else{
console.log("user not exits");
return false; }
});
现在当我用另一种方法调用它时,它不会及时返回布尔值。
if (findUserExists("username")){
// redirect to dashboard
console.log("user exits");
res.redirect('/dashboard');
}
else {
// redirect to sign up page
console.log("user must sign up");
res.redirect('/signup');
}
所以在这种情况下,其他函数在从findUserExists()获取布尔值之前运行,我的问题是如何让这个函数在其他函数运行之前返回一个值,我可以在IF中调用它条件甚至像这样的变种
var exists = findUserExists(name);
答案 0 :(得分:4)
您正试图在异步函数上强制使用同步代码。 简短的回答是:你不应该这样做
将您的函数转换为回调
function findUserExists(name, callback) {
User.findOne({ "name": name }, function (err, user) {
callback(user);
});
}
然后用作:
findUserExists("username", function (exists) {
if (exists) {
console.log("user exits");
res.redirect('/dashboard');
} else {
console.log("user must sign up");
res.redirect('/signup');
}
});
如果您使用节点4及更高版本,则可以使用 promises 代码看起来更加同步。
答案 1 :(得分:2)
在您的逻辑中存在一个问题,您在查询本身可能会出现没有处理错误,例如DB服务器关闭。 尽可能避免使用回调并切换到承诺,异步等待等。
使用承诺:
如果没有回复传递给Mongoose,那么它将返回一个Promise。如果查询成功,它将解决与文档。在这种情况下,如果用户不存在,那么将使用 null (link)解析它,如果用户存在,则将使用该文档解析。如果查询失败,例如数据库服务器不可用等,那么带有错误对象的承诺将被拒绝。
数据库调用
function findUserExists(name){
return User.findOne({ "name": name })
.then(function(doc){//This function will be executed if DB query was successful.
//You can write additional logic if any to handle the returned doc here
return doc;
}, function(err){// This function will be executed if something goes wrong with db server or query.
//You can write logic for error handling in DB connection like logging DB failure.
return err;
})
}
<强>验证强>
findUserExists(name)
.then(function(user){//Resolved callback: This function is executed if previous promise was resolved
if(!user){ //If user does not exist null will be returned
console.log('User must sign up');
return res.redirect('/signup');
}
console.log('User Exists');
return res.redirect('/dashboard');
},function(err){ //This function is executed if previous promise is rejected
console.log('Some error occurred in DB query');
})
答案 2 :(得分:1)
这是因为您的findUserExists
函数调用异步,但您尝试同步使用它。
为了实现您想要做的事情,您需要为您的函数提供回调函数或返回承诺。最简单的方法,因为你已经在mongoose中使用回调,就像这样:
function findUserExists(name , callback ){
User.findOne({ "name": name }, function(err, user) {
if( err ) callback( err );
else if (user){
console.log("user exits");
callback( null, true );
}
else{
console.log("user does not exist");
callback( null, false );
}
});
findUserExists( "username", function( err, user ){
if( err ) console.log( err );
else if( user ){
console.log("user exits");
res.redirect('/dashboard');
// redirect to dashboard
}
else {
// redirect to sign up page
console.log("user must sign up");
res.redirect('/signup');
}
}