【问题标题】:Handling data with get request in node with mongodb database使用 mongodb 数据库在节点中使用 get 请求处理数据
【发布时间】:2015-12-03 03:59:51
【问题描述】:

菜鸟问题..如何将猫鼬查询与 JSON 响应同步?以下代码返回空值,因为查询稍后结束。有什么办法处理?

router.route('/admin')
    .get(function (req, res ) {
        var country = [];
        var element = [];
        Country.find({}, function (err, data) {
            country = data; 
        });
        Items.find({}, function (err, data) {    
            element = data;         
        }); 
        res.json({
            countries: country,
            elements: element
        });         
    }); 

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    country.find 和 Items.find 是异步执行的 - 并同时运行。 您需要将它们嵌套在回调函数中以支持异步执行模式 - 这样您就可以确保它们同步执行。所以你的代码需要看起来像这样:

    Country.find({}, function (err, data) {
            country = data; 
            Items.find({}, function (err, data) {    
                element = data;        
                res.json({
                  countries: country,
                  elements: element
                });   
            }); 
        });
    

    更高级且可能更好的方法是使用 Promise 库——这意味着它们仍然是异步执行的,但只有在所有函数的所有结果都可用时才会返回完整的结果——这在此处进行了解释:

    Executing several mongoose queries: how to use promises instead?

    【讨论】:

    • 谢谢。您的解决方案有效,但我正在寻找一种处理这种情况的好方法,并且链接参考仍然让我感到困惑。
    • 就异步编程中的事物状态而言,“最好”的方式(如果您没有注意到 - 欢迎来到异步编程的狂野而奇妙的世界 - 这很难我首先要理解,特别是如果你来自像 Java 这样的“经典”同步语言;) - 正在使用 Promise - 这是一种允许执行多个异步进程的设计模式 - en.wikipedia.org/wiki/Futures_and_promises
    • 我已经用 jQuery 进行了异步调用,在 ajax 调用中定义了异步参数。宽度节点我期待一种类似的方式来处理它。我会更加冷静的看一下promise模式。
    猜你喜欢
    • 2021-10-13
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多