async watefall不会调用函数

时间:2016-05-29 13:05:39

标签: javascript node.js asynchronous mongoose

所以我实际上正在使用node.Js编写一个简单的程序,并且我使用async.waterfall时遇到了问题:

  • 我在我的用户模型中创建了一个函数,通过访问数据库来连接用户,这里是代码:

    exports.connection = function (login,password) {
    
    async.waterfall([
    function getLogin(callback){
          usersModel.findOne({ login: login }, function (err, res) {
            if (err){
              callback(err,null);
              return;
            }
            if(res != null ){
              //  test a matching password if the user is found we compare both passwords
              var userReceived = res.items[0].login;
              callback(null,userReceived);
            }
          });
    },
    function getPassword(userReceived, callback){
          console.log(userReceived);
          callback(null,'done')
        }
    ], function(err){
      if (err) {
        console.error(err);
      }
        console.log('success');
    });
    }
    

    使用node-inspector我发现主要问题(我认为)是当它进入瀑布函数时它不执行findOne的回调函数它会直接跳过它并直接跳转到getPassword函数(这是也执行了。

所以,如果有人可以帮我弄清楚问题是什么,因为我现在已经用了大约两天了。

谢谢

修改 添加了不同的测试缺失案例(这就是回调没有奏效的原因)后,我有了这个连接函数:

exports.connection = function (login,password) {

async.waterfall([
function getLogin(callback){
    usersModel.findOne({ login: login }, function (err, res) {
      console.log('login: ',res.login);
      console.log('erreur: ',err);
      if (err){
        callback(err,null);
        return;
      }
      if(!res)
      {
        console.log('getLogin - returned empty res');
        callback('empty res');
      }
      if(res != null ){
        //  test a matching password if the user is found we compare both passwords
        var userReceived = res;
        callback(null,userReceived);
      }
    });
},
function getPassword(userReceived, callback){

    console.log('login received :',userReceived.login);
    var Ulogin = userReceived.login;
    var Upassword = userReceived.password;
 // function that compare the received password with the encrypted 
 //one
    bcrypt.compare(password, Upassword, function(err, isMatch) {
        if (err) {
          console.log(err);
          callback(err,null);
          return;
        }
        else if (isMatch) {
          console.log('Match', isMatch);
          callback(null,isMatch);
        }
        else {
          console.log('the password dont match', isMatch);
          callback('pwd error',null);
        }
    });
},
], function(err){
  if (err) {
    console.error('unexpected error while connecting', err);
    return false;
  }
    console.log('connected successfully');
    return true;
});
}

在我的主文件server.js中,我正在做的事情:

var connect = users.connection(login,password);
//the goal is to use the connect variable to know if the connection
//failed or not but it's 'undefined'
if(connect){
       res.send('youyou connecté');
 }
 else {
       res.send('youyou problem');
 }

这绝对不行,所以我试图使用Q库,但我有一个错误说

“TypeError:无法读取Promise.apply中未定义的属性'apply'”

这是使用Q的代码:

  app.post('/signup', function (req, res) {
  var login = req.body.login;
   var password = req.body.password;
   Q.fcall(users.connection(login,password))
   .then(function (connect) {
     if(connect){
       res.send('connected');
     }
     else {
       res.send('problem');
     }
   })
   .catch(function (error) {
       throw error;
   })
   .done();
});

但我有点惊讶我认为通过使用async.waterfall()我告诉函数等待它收到所有回调返回所以我不明白为什么connect变量是'undefined'?

1 个答案:

答案 0 :(得分:0)

我不明白的是 - 究竟是什么流程?做过用户模特。找到了一个'被叫?

我在getLogin函数中看到的内容是回调,如果' if'声明返回false。在这种情况下,您将陷入第一个功能,并且您无法前进到“获取密码”。功能

如果仍然无效,请尝试执行以下代码并报告打印内容:

exports.connection = function (login,password) {
async.waterfall([
function getLogin(callback){
      usersModel.findOne({ login: login }, function (err, res) {
        if (err){
          console.log('getLogin - error has occured');
          callback(err,null);
          return;
        }
        if(!res)
        {
          console.log('getLogin - returned empty res');
           callback('empty res');
        }

        console.log('getLogin - result seems OK');

        //  test a matching password if the user is found we compare both passwords
        var userReceived = res.items[0].login;
        callback(null,userReceived);
        }
      });
},
function getPassword(userReceived, callback){
       console.log('getPassword');
      console.log(userReceived);
      callback(null,'done')
    }
], function(err){
  if (err) {
    console.error(err);
  }
    console.log('success');
});
}