Node.js 异步和多个异步数据库调用
我在node/mongoose应用程序中使用了异步库,但遇到了一些我不理解的问题。我得到了这段代码:Node.js 异步和多个异步数据库调用,node.js,node-async,Node.js,Node Async,我在node/mongoose应用程序中使用了异步库,但遇到了一些我不理解的问题。我得到了这段代码: var model_1; async.series([ function (callback) { Model1.findOne( {_id: mongoose.Types.ObjectId(model1_id)}, function (err, model1) { if (err) { callaback(err)
var model_1;
async.series([
function (callback) {
Model1.findOne( {_id: mongoose.Types.ObjectId(model1_id)}, function (err, model1) {
if (err) {
callaback(err);
} else {
model_1 = model1;
callback();
}
});
},
function (callback) {
async.forEach(req.body.myArray, function (element, callback) {
model2 = new Model2();
model2.name = element.name;
Model3.findOne( { _id: element.model3_id }, function (err, model3) {
if (err) {
callaback(err);
} else {
Model4.findOne( { _id: element.model4_id }, function (err, model_4) {
data.push({
model_1: model_1,
model_2: model_2,
model_3: model_3,
model_4: model_4,
});
callback();
});
}
});
}
}, function (err) { /* callback for async.forEach */
if (err) {
callback(err);
} else {
for(var i = 0; i < data.length; i++) {
console.log(i+": m2 id: "+data[i].model_2._id);
console.log(i+": m3 id: "+data[i].model_3._id);
console.log(i+": m4 id: "+data[i].model_4._id);
}
}
});
}], function (err) { /* callback for async.series */
if (err) {
next(err);
}
});
我遇到的问题是,当我打印数据时,在async.forEach回调中,model_2.id对于所有元素都是相同的,model_3和model_4 id与myArray中的相同,OK,但我在数据变量中的所有位置都得到了相同的model_2对象。如何解决这个问题?我可以将model_2传递给我的find调用吗?在异步中不使用前面的“var”来执行此操作。forEach()的回调使model2成为全局的:
model2 = new Model2();
async.forEach()并行(而不是串行)处理req.body.myArray中的条目,因此它可以非常快速地遍历所有条目,而无需等待Model3.findOne()完成并将数据推送到数组中。这就是为什么model2的值相同。您需要在model2前面添加“var”,如下所示,这样循环的每个迭代都有自己的model2副本,因此在通过req.body.myArray循环时不会被覆盖:
var model2 = new Model2();
另一个选项是使用async.eachSeries(),它以串行方式处理req.body.myArray,这样model2就不会被覆盖
var model2 = new Model2();