Node.js 节点和mongoose的Asycn问题

Node.js 节点和mongoose的Asycn问题,node.js,asynchronous,mongoose,Node.js,Asynchronous,Mongoose,所以我对node是一个全新的人,我正在尝试为一个类完成一个简单的web应用程序。 基本上,我有一些代码想要将用户添加到数据库,这取决于添加到数据库是否成功,密码是否错误,或者用户名是否超过128个字符,然后我想要返回一个值。所以,在我的例子中,这个家伙就是那个值。我想返回dude=100或我设置的任何值,但dude仍然是0。我该如何去“等待”,这样男人就可以100岁了,而不需要设置超时。谢谢 exports.add= function (user, password) { va

所以我对node是一个全新的人,我正在尝试为一个类完成一个简单的web应用程序。 基本上,我有一些代码想要将用户添加到数据库,这取决于添加到数据库是否成功,密码是否错误,或者用户名是否超过128个字符,然后我想要返回一个值。所以,在我的例子中,这个家伙就是那个值。我想返回dude=100或我设置的任何值,但dude仍然是0。我该如何去“等待”,这样男人就可以100岁了,而不需要设置超时。谢谢

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

对于异步编程的新用户来说,这是一个非常常见的问题。您试图做的是从同步函数返回一个值,该值取决于异步函数的结果。在这种情况下,
returndude
实际上是在设置
dude=100之前调用的。您需要接受对add函数的回调,一旦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');
  });

});

很抱歉,这是一个很好的答案,但我还是无法理解!所以我会用我想要返回的特定值调用done,但是在哪里定义了done呢?另外,你说添加完成后呼叫完成,但我不确定该呼叫在哪里进行,再次感谢!我在答案中添加了一些示例,向您展示了如何在回调中使用add函数。哇,非常感谢!!很多人说“哦,只是使用回调”,但我不知道它们是什么,甚至读到关于它们的文章都让我更加困惑,但这确实澄清了很多!再次感谢!