猫鼬 对于循环中的每个元素

Mongoose For each element in loop

本文关键字:元素 循环 于循环 猫鼬      更新时间:2023-09-26

我正在尝试遍历数组并将数组中的项目添加到 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();
        }
      });
  }

我认为这个错误与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]);
}