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