我有一系列名字:
var names = [“Kelley”,“Amy”,“Mark”]
假设Person只是nodejs的Mongoose模型...我想将每个名称作为文档保存到mongodb中,并带有以下内容:
for(var i = 0; i < names.length; i++) {
name_now = names[i];
Person.findOne({ name: name_now},
function(err, doc) {
if(!err && !doc) {
var personDoc = new PersonDoc();
personDoc.name = name_now;
console.log(personDoc.name);
personDoc.save(function(err) {});
} else if(!err) {
console.log("Person is in the system");
} else {
console.log("ERROR: " + err);
}
}
)
}
我遇到问题,因为我一直在设置“错误创建时间表:MongoError:E11000重复键错误索引:..... dup key:{:”Mark“}”。它似乎试图插入“Mark”(列表中的最后一个元素)3次,而不是列表中的每个名称。
当我尝试在循环中打印出当前人的名字时(使用console.log(personDoc.name);),我得到“Mark”3次......并且它似乎只保存了“标记“在数据库中没有其他人......处理这个问题的正确方法是什么?
答案 0 :(得分:1)
在findOne
回调期间,name_now
始终将设置为names
中的姓氏,因为for
循环在第一个回调被调用之前完成。您需要创建一个立即函数来捕获每次迭代期间的当前name_now
值并保留它以用于回调:
for(var i = 0; i < names.length; i++) {
(function (name_now) {
Person.findOne({ name: name_now},
function(err, doc) {
if(!err && !doc) {
var personDoc = new PersonDoc();
personDoc.name = name_now;
console.log(personDoc.name);
personDoc.save(function(err) {});
} else if(!err) {
console.log("Person is in the system");
} else {
console.log("ERROR: " + err);
}
}
);
)(names[i]);
}