Node.js 节点和mongoose的Asycn问题
所以我对node是一个全新的人,我正在尝试为一个类完成一个简单的web应用程序。 基本上,我有一些代码想要将用户添加到数据库,这取决于添加到数据库是否成功,密码是否错误,或者用户名是否超过128个字符,然后我想要返回一个值。所以,在我的例子中,这个家伙就是那个值。我想返回dude=100或我设置的任何值,但dude仍然是0。我该如何去“等待”,这样男人就可以100岁了,而不需要设置超时。谢谢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
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函数。哇,非常感谢!!很多人说“哦,只是使用回调”,但我不知道它们是什么,甚至读到关于它们的文章都让我更加困惑,但这确实澄清了很多!再次感谢!