节点和猫鼬的异步问题

时间:2014-09-24 19:32:14

标签: node.js asynchronous mongoose

所以我对节点完全不熟悉,我正在尝试为一个类完成一个简单的Web应用程序。 基本上我有一些代码想要将用户添加到数据库中,并且取决于数据库的添加是否成功或密码是否错误或用户名是否超过128个字符,那么我想返回一个值。所以我的例子中的家伙就像那个价值一样。我想要回复dude = 100或者我设定的任何东西,但是老兄继续为0.我该如何去等待"所以这个家伙可以是100,不会涉及到设定时间。谢谢!

    exports.add= function (user, password) { 
    var dude = 0;
    User.findOne({'local.user' : user, function(err, current_user) {
     dude = 100;
    });
    return dude;
    }

1 个答案:

答案 0 :(得分:1)

对于异步编程的新用户来说,这是一个非常常见的问题。您尝试做的是从同步函数返回一个值,该函数取决于异步函数的结果。在这种情况下,return dude实际上是在您设置dude = 100;之前调用的。您需要接受对该add函数的回调,该函数可在添加完成后调用。如下所示:

exports.add = function (user, password, done) { 
  User.findOne({'local.user' : user, function(err, current_user) {
   done(err, 100); //  pass the err and code to the callback
  });
}

更新

缩小一点,这就是你使用新模块的方法。

var User = require('./user'); // load the module defined above.

User.add(user, password, function(err, code) {
  if(err || code === 123) {
    // Do something here.
  }
});

这定义了一个内联函数,当User.add完成添加用户时调用该函数。缩小一点(假设是Express)看起来像是:

var User = require('./user'); // load the module defined above.

app.post('/user/', function(req, res) {
  var user = buildUserFromReq(req);
  var password = req.body.password;

  User.add(user, password, function(err, code) {
    if(err) {
      return res.send('cannot add user', err);
    }

    res.send('user added');
  });

});