sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongoose agrega varios elementos a la base de datos

El problema aquí es que en el findOne devolución de llamada - su beerId siempre se establecerá en la última cerveza en beerObjects , porque el ciclo finaliza antes de que llegue a su primera devolución de llamada:bienvenido a javascript asíncrono.

Un remedio para esto es envolver su findOne código en una IFFE (Expresión de función invocada inmediatamente). Este código se completará antes de pasar a la siguiente cerveza de beerObject.

Aquí hay más información sobre IFFE

Desbordamiento de pila en IFFE

Eché un vistazo rápido al código, creo que debería funcionar, pero es posible que tengas que hacer algunos ajustes con el código interno...

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