2013-06-26 30 views
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(); 
     } 
     }); 
    } 
+2

請問您可以提供有關哪些工作不正常的更多詳細信息。問題不明確。 – verybadalloc

+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 //... 
} 

然後,在您的路由器代碼中:

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

感謝您的詳細解答 –

+0

這有一些問題,當數組發生變化時,所有內容都會重新寫入。這隻在數組沒有變化時才起作用。 –