async.auto结果对象应该有一个值但是有一个数组为2

时间:2016-04-09 06:18:32

标签: javascript node.js mongodb asynchronous mongoose

我正在尝试使用异步与MongoDb进行交互。我的async.auto调用出于某种原因,当只应该有一个时,我会向results参数添加一个包含2个对象的数组。

    async.auto({
        pantMeasurement: function (callback) {
            app.models.PantMeasurement.findOne({ temp_user_id: req.session.temp_user_id }, function (err, pantMeasurement) {
                var pantData = {'waist', 'length'};
                if (!pantMeasurement) {
                    return app.models.PantMeasurement.create(_.extend({ temp_user_id: req.session.temp_user_id }, pantData), callback);
                }
                _.extend(pantMeasurement, pantData);

                pantMeasurement.save(callback);
            });
        },
        user: ['pantMeasurement', function (callback, results) {
            var name = 'firstName';
            results.pantMeasurement.user_id = name;

            results.pantMeasurement.save(callback);  //ERROR HERE
        }]}, function(err, results) {
            ...
        }

在第二个任务user中,行results.pantMeasurement.save(callback);引发了save不存在的错误。单步执行代码后,这是因为results只有一个对象而没有数组时,有两个pantMeasurement对象的数组。该数组由一个pantMeasurement对象和一个空对象组成。

如果!pantMeasurement为true并且在数据库中创建了新条目,则代码可以正常工作。但是无论何时调用pantMeasurement.save(callback),我都会看到这个错误,我不明白为什么。

1 个答案:

答案 0 :(得分:1)

您没有提到用于访问mongodb的模块,但是当您使用Models时,我假设使用了mongoose。如果我是对的,请在问题中添加mongoose标签。如果没有,请忽略这个答案。

Mongoose API documentation表示Model#save()回调有三个参数:

function (err, document, numAffected) {
  //...
}
  • 错误是可选错误
  • 文档是已保存的文档
  • 如果文档在数据库中已更改,则numAffected为1,如果文档不需要更改,则为0(因为它是最新的)

在你的调试屏幕截图中你可以看到,数组中的第二个元素不是空对象而是数字0.这个数字是由save-callback传递给async-result的numAffected-Parameter,所以这就是你得到一个数组的原因。

为了简化代码,您可能应该考虑使用findOneAndUpdate()语句,该语句允许您一步查找和更新文档。它还接受一个upsert-option,如果没有,将创建一个新文档。