2016-04-08 58 views
1

我有這個代碼的兩個問題。 1)只有beerObjects的最後一個元素被保存到數據庫中。 2)保存到數據庫的最後一個元素(n = beerObjects.length)有n個重複項。Mongoose將多個項目添加到數據庫

function addBeersToDatabase(beerObjects) { 
for (i = 0; i < beerObjects.length; i++) { 
    console.log(beerObjects[i].beerId); 
    var currentBeer = beerObjects[i]; 

    // check if beer is already in database 
    Beer.findOne({'beerId': currentBeer.beerId}, function(err, beer){ 
     if (err) { 
      handleError(err); 
     } 
     if (beer) { 
      // beer is already in database 
     } 
     else { 
      // add new beer to database 
      console.log(currentBeer.beerId); 
      var newBeer = new Beer(); 
      newBeer.beerId = currentBeer.beerId; 
      newBeer.name = currentBeer.name; 
      newBeer.description = currentBeer.description; 
      newBeer.abv = currentBeer.abv; 
      newBeer.image = currentBeer.image; 

      newBeer.save(function(err) { 
       if (err) { 
        throw err; 
       } 
      }); 
     } 
    }); 
} 

}

我想遍歷每個啤酒,並保存其到數據庫中的信息。我用findOne來防止重複,但這是行不通的。第一個console.log()語句打印每個啤酒ID,但seconds console.log()語句多次打印最後一個啤酒ID。

回答

3

的這裏的問題是,在findOne回調 - 你beerId將始終在beerObjects設置爲最後的啤酒,因爲循環完成你得到你的第一個回調之前 - 歡迎來到異步JavaScript。

對此的一種解決方法是將您的findOne代碼包裝在IFFE(立即調用的函數表達式)中。在從beerObject移動到下一個啤酒之前,此代碼將完成。

這裏是IFFE

Stack Overflow on IFFE

一些更多的信息我把這個代碼快速通過,我認爲這應該工作,但是你可能不得不做出一些調整與內部代碼...

for(var i = 0; i < beerObjects.length; i++) { 
    console.log(beerObjects[i].beerId); 
    //var currentBeer = beerObjects[i]; dont need this now 
    (function (currentBeer) { 
     Beer.findOne({ beerId: currentBeer}, 
      function(err, beer) { 
       if(!err && !beer) { 
        var newBeer = new Beer(); 
        newBeer.beerId = currentBeer.beerId; 
        newBeer.name = currentBeer.name; 
        newBeer.description = currentBeer.description; 
        newBeer.abv = currentBeer.abv; 
        newBeer.image = currentBeer.image; 
        newBeer.save(function(err) { 
         // log your error here... 
        }); 
       } else if(!err) { 
        console.log("Beer is in the system"); 
       } else { 
        console.log("ERROR: " + err); 
       } 
      } 
     ); 
    })(beerObjects[i].beerId); 
} 
相關問題