【问题标题】:async nodejs querying and processing results异步nodejs查询处理结果
【发布时间】:2011-08-14 01:13:02
【问题描述】:

我有一个从 mongodb 获取的对象数组。数组中的每个元素都是一篇文章,作者为 user_id。现在我希望找到与 user_id 相关的用户信息。

由于节点使用异步方法从 db 中查找数据,因此 forEach 循环在回调完成之前完成。

docs.forEach(function(doc, index){
        //get the user for this doc
        User.find({_id: mongo.BSONPure.ObjectID(doc.user_id)}, {name: 1, username: 1, email: 1}).skip(0).limit(1).toArray(function(err, user){
            user = user[0]
            if(err) {
                throw new Error(err)
            } else {
                docs[index].user = user
                if(doc.for_id) {
                    User.find({_id: mongo.BSONPure.ObjectID(doc.for_id)}, {name: 1, username: 1, email: 1}).skip(0).limit(1).toArray(function(err, for_user){
                        for_user = for_user[0]
                        if(err) {
                            throw new Error(err)
                        } else {
                            docs[index].for_user = for_user
                        }
                    })
                }
            }
        })
    })

所以在这个循环结束时,如果我发送一个 cb(docs),则 docs 没有 user 和 for_user 属性。我该如何克服这个问题?

【问题讨论】:

  • forEach 回调函数只接受一个参数,即当前文档的光标 > mongodb.org/display/DOCS/Queries+and+Cursors。您的示例中的索引应该是未定义的
  • 请改写你的问题的标题,因为这个不是描述性的

标签: asynchronous mongodb node.js


【解决方案1】:

使用Step for node.js。它会按顺序运行你的函数

var Step = require('step');

Step(  docs.forEach(...), function() { cb(docs); } );

或者,如果您知道记录的总数,您可以在处理完最后一条记录后调用回调。像这样的

var count = docs.count(); // or something
var processed = 0;
docs.forEach(... if (++processed == count) cb(docs); );

【讨论】:

    猜你喜欢
    • 2019-12-26
    • 2022-01-12
    • 2020-06-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    相关资源
    最近更新 更多