Node.js Mongodb,节点-同步更新多个对象

Node.js Mongodb,节点-同步更新多个对象,node.js,mongodb,express,async.js,Node.js,Mongodb,Express,Async.js,使用Mongodb、Nodejs、Async.js和Express.js 我正在尝试更新多个文档,其中每个文档都同时有自己的更新。我想等待所有文档更新,以便通知用户所有文档都已更新 我现在遇到的问题是我的回调函数没有启动,或者如果启动了,那么什么也没有发生。以下是我的进展: db.client.collection('page').find({page_id: page_id}).toArray(function(page_err, document_page) { if(page_er

使用Mongodb、Nodejs、Async.js和Express.js

我正在尝试更新多个文档,其中每个文档都同时有自己的更新。我想等待所有文档更新,以便通知用户所有文档都已更新

我现在遇到的问题是我的回调函数没有启动,或者如果启动了,那么什么也没有发生。以下是我的进展:

db.client.collection('page').find({page_id: page_id}).toArray(function(page_err, document_page) {
    if(page_err) {
        throw page_err;
    } else if(document_page === '' || document_page === undefined || document_page === null) {
        throw page_err;
    } else {
        var count = 0;
        async.each(data, function iteratee(i, callback) {
            var item_id = (i.item_id === '') ? new ObjectId() : new ObjectId(i.item_id);
            var query = {item_id: item_id};
            var update = {
                _id : new ObjectId(),
                page_id : page_id,
                section_id : null,
                item_id : item_id,
                created : new Date().toISOString(),
                item_type : "dish",
                item: {
                    title: i.title,
                    description: i.description,
                    price: i.price,
                    star: false,
                    double_star: false
                },
                last_modified: new Date().toISOString()
            };
            var options = { upsert: true };

            db.client.collection('item').updateOne(query, {$set: update}, options, function(item_err, results) {
                if(item_err) {
                    res.sendStatus(500);
                } else if(results === '' || results === undefined || results === null) {
                    res.sendStatus(400);
                } else {
                    ++count;
                    if(count === data.length) {
                        callback();
                        return;
                    }
                }
            });
        }, function() {
            console.log('sending 200 status');
            res.sendStatus(200);
        });
    }
});

当我运行代码时,我会输入if语句,在这里我调用callback()。我已经在这个问题上纠缠了几个小时,我无法让它工作。如果你需要更多的信息,我很乐意提供。为了简单起见,我删除了许多console.log以避免混乱。

所有迭代都需要启动回调,否则它将无限期挂起<代码>回调必须在每次迭代中调用。总是

如果遇到错误,需要调用
callback(error)
。您将遇到的问题是async.each预先安排所有迭代,因此
iteratee
将触发
data.length
次,而不管在执行过程中是否遇到错误。如果需要串联运行它们,可以使用
async.eachSeries
,这将花费更多时间,但可以提供更好的控制,并且无需回滚

因此,从代码角度看,它如下所示:

    db.client.collection('page').find({page_id: page_id}).toArray(function(page_err, document_page) {
        if(page_err) {
            throw page_err;
        } else if(document_page === '' || document_page === undefined || document_page === null) {
            throw page_err;
        } else {
            async.each(data, function iteratee(i, callback) {
                var item_id = (i.item_id === '') ? new ObjectId() : new ObjectId(i.item_id);
                var query = {item_id: item_id};
                var update = {
                    _id : new ObjectId(),
                    page_id : page_id,
                    section_id : null,
                    item_id : item_id,
                    created : new Date().toISOString(),
                    item_type : "dish",
                    item: {
                        title: i.title,
                        description: i.description,
                        price: i.price,
                        star: false,
                        double_star: false
                    },
                    last_modified: new Date().toISOString()
                };
                var options = { upsert: true };

                db.client.collection('item').updateOne(query, {$set: update}, options, function(item_err, results) {
                    if(item_err) {
                        callback(500);
                    } else if(results === '' || results === undefined || results === null) {
                        callback(400)
                    } else {
                        callback();
                    }
                });
            }, function(err) {
                // Passing the status code only for the example.
                // `err` should be an object with more metadata probably
                if(err) {
                    res.sendStatus(err);
                    return;
                }
                console.log('sending 200 status');
                res.sendStatus(200);
            });
        }
    });

很抱歉反应太晚,但这起作用了。非常感谢!正如您所说,我在应用程序流的其余部分缺少回调