【问题标题】:Async call in node.js vs. mongoosenode.js 与 mongoose 中的异步调用
【发布时间】:2013-01-25 23:50:39
【问题描述】:

我有一个使用 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);

items 未定义(我认为是因为 db.list() 的非异步定义)。

我做错了什么,如何纠正?

【问题讨论】:

    标签: node.js mongoose


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

    【讨论】:

    • 真的是我想要的!非常感谢。
    猜你喜欢
    • 2015-02-19
    • 2017-06-21
    • 2014-05-13
    • 2016-03-30
    • 2012-09-24
    • 2017-03-19
    • 2015-02-23
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多