0

我有一个名字数组:

var 名称 = [“凯利”、“艾米”、“马克”]

假设 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);),我得到了 3 次“Mark”......它似乎只保存了“Mark”数据库,没有其他人......处理这个问题的正确方法是什么?

4

1 回答 1

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]);
}
于 2012-09-25T20:31:57.820 回答