繁体   English   中英

节点js回调为var

[英]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 不存在 ,则将使用nulllink )进行解析,如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM