node js回调为var

时间:2016-05-22 09:57:03

标签: javascript node.js mongodb

我试图创建一个方法,我可以从我的快递应用程序的所有部分调用,我只是将值传递给此方法,它使用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);

3 个答案:

答案 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');
      }
    }