![](/img/trans.png)
[英]node js prototype object 'self' var does not store correct context for callback
[英]node js callback as var
我试图创建一个可以从我的Express应用的所有部分调用的方法,我只是将一个值传递给此方法,然后使用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条件甚至是IF条件下调用它的方式像这样的变种
var exists = findUserExists(name);
您试图在异步函数上强制使用同步代码。 简短的答案是: 您不应该这样做
将您的函数转换为回调
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和更高版本,则可以使用promise使代码看起来更加同步。
按照您的逻辑,这是有问题的,您没有处理查询本身可能发生的错误 ,例如DB服务器停机。 避免尽可能多地使用回调 ,而切换到Promise,异步等待等。
使用承诺:
如果没有回调传递给猫鼬,它将返回一个Promise。 如果查询成功 ,它将与文档一起解决 。 在这种情况下,如果user 不存在 ,则将使用null ( link )进行解析,如果user存在,则将使用该文档进行解析。 如果查询失败 (例如,数据库服务器不可用等),则该承诺将被err对象拒绝 。
数据库调用
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');
})
这是因为您的findUserExists
函数调用异步,但是您试图同步使用它。
为了实现您想要做的事情,您需要为您的函数提供一个回调函数或返回一个Promise。 最简单的方法,因为您已经在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');
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.