mongoose对于循环中的每个元素

我试图通过一个数组循环,并将数组中的项目添加到一个mongodb数据库,如果它不存在已经。 在循环内我试图查询我的数据库,如果数组中的下一个元素已经在数据库中。 但是在callback函数中,console.log总是返回数组的最后一个元素。

for(var j = 0 ; j < req.body.array.length; j++ ){ var currenttag = req.body.array[j]; Tag.findOne({tagname : currenttag}, function(err,tag){ if(tag){ console.log("tag exists"); } else{ console.log(currenttag);//returns the last tag in the array for array.length times var newtag = new Tag({tagname : currenttag}); newtag.save(); } }); } 

我认为这个错误与在Javascript中如何处理闭包相关。 请在这里查看我的答案,以获取更多细节。

在你的情况下,事件处理程序正在获取currentTag的引用,它被设置为循环的最后一个元素。

要解决这个问题,你可以尝试做下面的事情:

 var createTagIfMissing = function (currentTag){ Tag.findOne({tagname : currenttag}, function(err,tag){ if(tag){ console.log("tag exists"); } else{ console.log(currenttag); var newtag = new Tag({tagname : currenttag}); newtag.save(); } }); } for(var j = 0 ; j < req.body.array.length; j++ ){ createTagIfMissing(req.body.array[j]); } 

您可以进一步推送,并将此方法定义为您的代码统计之一:

 //In your db.js file, before mongoose.model('Tag',Tag); Tag.statics.createTagIfMissing = function(tag){ this.findOne //... } 

那么,在你的路由器代码中:

 for(var j = 0 ; j < req.body.array.length; j++ ){ Tag.createTagIfMissing(req.body.array[j]); }