MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoose ajoute plusieurs éléments à la base de données

Le problème ici est que dans le findOne rappel - votre beerId sera toujours défini sur la dernière bière dans beerObjects , car la boucle se termine avant que vous n'arriviez à votre premier rappel - bienvenue dans le javascript asynchrone.

Un remède à cela est d'envelopper votre findOne code dans une IFFE (Immediately Invoked Function Expression). Ce code se terminera avant de passer à la prochaine bière de beerObject.

Voici quelques infos supplémentaires sur l'IFFE

Débordement de pile sur IFFE

J'ai passé rapidement au code, je pense que cela devrait fonctionner, mais vous devrez peut-être faire quelques ajustements avec le code interne...

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