我有一个 for 循环,可以在 MongoDB 中插入文档。使用异步系列,我运行循环五次,然后关闭连接。由于某种奇怪的原因,当循环第六次执行时,我收到插入错误。我只是不确定这里发生了什么。有任何想法吗?
var mycollection= "abcd";
var count = 5;
var db;
var col;
async.series([
// Connect to DB
function(callback) {
MongoClient.connect("mongodb://connection-path-here",function(error, db2) {
if (error) {console.log("db connect error");callback(error,"db connect error"); return;}
db = db2;
callback(null,"connect success");
});
},
function(callback) {
col = db.collection(mycollection);
callback(null,"collection success");
},
function(callback) {
console.log ("insert begin ...");
for (var i = 1; i <= count; i++) {
console.log("inserting ....." + i);
col.insert({c:i}, function(error,result) {
if (error) {console.log("insert error:" + i);callback(error,"insert error"); return;}
});
}
callback(null,"insert success");
},
function (callback){
console.log ("close db");db.close();
callback(null,"connection closed");
}
], function(error, results) {
if (error) { console.log("error"); }
console.log(results);
});
输出
insert begin ...
inserting .....1
inserting .....2
inserting .....3
inserting .....4
inserting .....5
close db
insert error:6
error
[ 'connect success', 'collection success', 'insert error' ]
insert error:6
insert error:6
insert error:6
insert error:6
最佳答案
你开始得很好,但你在这里混合了异步和非异步方法:
function(callback) {
console.log ("insert begin ...");
for (var i = 1; i <= count; i++) {
console.log("inserting ....." + i);
col.insert({c:i}, function(error,result) {
if (error) {console.log("insert error:" + i);callback(error,"insert error"); return;}
});
}
callback(null,"insert success");
},
这不会在迭代下一个循环之前等待插入完成,因此您需要等待的东西。尝试“async.while”:
function(callback) {
var i = 1;
async.whilst(
function() { return i <= count },
function(callback) {
col.insert({ c: i },function(error,result) {
if (error)
console.log("insert error:" + i);
i++;
callback(error);
});
},
function(error) {
callback(error,"insert sucess")
}
);
},
其余的可以按照您正在做的方式进行,结果将发送到系列执行的末尾。
关于javascript - 使用node.js异步系列插入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25659134/