2016-04-08 11 views
1

このコードには2つの問題があります。 1)ビールオブジェクトの最後の要素のみがデータベースに保存されます。 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を表示しますが、console.log()ステートメントは最後のビールIDだけを複数回表示します。ループが終了するので、あなたがあなたの最初のコールバックに入る前に、あなたのbeerIdは常に、beerObjectsで最後のビールに設定されます - - 非同期JavaScriptに歓迎ここ

答えて

3

問題がfindOneコールバックでいることです。

あなたのfindOneコードをIFFE(Immediately Invoked Function Expression)にラップする方法があります。このコードは、ビールオブジェクトから次のビールに移動する前に完了します。

はここで、私はこれが動作するはずと信じて、私はコードで簡単にパスを取っStack Overflow on IFFE

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); 
} 
関連する問題