我有一个使用mongoose连接的node.js应用 一个mongodb;我需要选择插入的所有文件和我 我对异步的东西有问题。
我用以下功能制作了一个模型:
exports.listItems=function() {
Ticket.find({}, function(err,tkts) {
console.log(tkts);
return tkts;
});
}
我正确地看到了“tkts”的值,但当我从以下地方调用它时:
exports.list = function(req,res) {
var items=db.listItems();
console.log("Items:"+items);
res.render('list', { title: title, items:items });
}
在app.js中定义为:
app.get('/list', routes.list);
项是未定义的(我认为是因为db.list()的非异步定义)。
我做错了什么以及如何纠正?
答案 0 :(得分:1)
您需要更恰当地使用回调。
更传统的listItems
功能将是
exports.listItems = function(done) {
Ticket.find({}, done);
}
然后,在list
中,你可以这样做:
exports.list = function(req,res) {
db.listItems(function(err,items){
console.log("Items:"+items);
res.render('list', { title: title, items:items });
});
}
由于Node.JS的异步特性,您应该始终在函数中传递(并期望)回调。因此,如果执行异步操作,您可以推迟执行。
另外:请务必查看async,它是一个非常好且易于使用的库,可以轻而易举地简化复杂的异步方案。