我正在尝试遍历数组并将数组中的项添加到mongodb数据库(如果它已经不存在)。在循环内部,我尝试查询我的数据库,如果数组中的下一个元素已经在数据库中。但是在回调函数中,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();
}
});
}
答案 0 :(得分:3)
我认为错误与Javascript中如何处理闭包有关。有关这意味着什么的详细信息,请参阅我的回答here。
在您的情况下,事件处理程序获得对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 //...
}
您可以进一步推动这一点,并将此方法定义为您的Tag静态之一:
for(var j = 0 ; j < req.body.array.length; j++ ){
Tag.createTagIfMissing(req.body.array[j]);
}
然后,在您的路由器代码中:
{{1}}