node.js与mongoose中的异步调用

时间:2013-01-25 15:46:23

标签: node.js mongoose

我有一个使用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()的非异步定义)。

我做错了什么以及如何纠正?

1 个答案:

答案 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,它是一个非常好且易于使用的库,可以轻而易举地简化复杂的异步方案。