2016-04-08 11 views
1

Bu kodla ilgili iki sorunum var. 1) Sadece beerObjects öğesinin son elemanı veritabanına kaydedilir. 2) Veritabanına kaydedilen son öğenin (n = beerObjects.length) n kopyası vardır.Mongoose veritabanına birden çok öğe ekle

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

}

Her bira içinde döngü istiyorum ve veritabanına onun bilgi kaydedin. Çiftleri önlemek için findOne kullandım ama bu çalışmıyor. İlk konsol.log() ifadesi her bira kimliğini yazdırır ancak saniye konsol.log() ifadesi birkaç kez sadece son bira kimliğini yazdırır. asenkron javascript karşılama - Eğer ilk geri arama ulaşmadan döngü tamamlandığında oluyor, çünkü beerId daima beerObjects son bira ayarlanır - burada

cevap

3

konu findOne geri aramasında olmasıdır.

Bunun için bir çözüm, findOne kodunuzu IFFE (Hemen Başlatılan İşlev İfadesi) içine sarmaktır. Bu kod, beerObject'ten bir sonraki biraya geçmeden önce tamamlanacaktır.

İşte, bu çalışması gerekir inanıyoruz koda bir hızlı geçiş aldı Stack Overflow on IFFE

IFFE

ilişkin bazı bilgiler olmakla birlikte, iç koduyla bazı ayarlamalar yapmanız gerekebilir ...

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