首页 文章

Mongoose对于循环中的每个元素

提问于
浏览
1

我试图循环一个数组,并将数组中的项添加到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();
        }
      });
  }

1 回答

  • 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]);
    }
    

    您可以进一步推动这一点,并将此方法定义为您的Tag静态之一:

    //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]);
    }
    

相关问题