我正在尝试使用异步与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)
,我都会看到这个错误,我不明白为什么。
答案 0 :(得分:1)
您没有提到用于访问mongodb的模块,但是当您使用Models时,我假设使用了mongoose。如果我是对的,请在问题中添加mongoose标签。如果没有,请忽略这个答案。
Mongoose API documentation表示Model#save()回调有三个参数:
function (err, document, numAffected) {
//...
}
在你的调试屏幕截图中你可以看到,数组中的第二个元素不是空对象而是数字0.这个数字是由save-callback传递给async-result的numAffected-Parameter,所以这就是你得到一个数组的原因。
为了简化代码,您可能应该考虑使用findOneAndUpdate()语句,该语句允许您一步查找和更新文档。它还接受一个upsert-option,如果没有,将创建一个新文档。