【问题标题】:Mongodb, Node - Updating multiple objects synchronouslyMongodb,Node - 同步更新多个对象
【发布时间】:2018-03-30 14:25:50
【问题描述】:

使用 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 语句。我已经坚持了几个小时,我无法让它工作。如果您需要更多信息,我很乐意提供。为简单起见,我删除了许多 console.logs 以避免混乱。

【问题讨论】:

    标签: node.js mongodb express async.js


    【解决方案1】:

    所有迭代都需要触发回调,否则它将无限期挂起。 callback 必须在每次迭代中调用。总是。

    如果遇到错误,需要致电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);
                });
            }
        });
    

    【讨论】:

    • 抱歉,回复晚了,但这行得通。非常感谢!就像你说的,我在应用程序流程的其余部分中缺少回调
    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多