O problema aqui é que no
findOne
retorno de chamada - seu beerId
será sempre definido para a última cerveja em beerObjects
, porque o loop termina antes de você chegar ao seu primeiro retorno de chamada - bem-vindo ao javascript assíncrono. Uma solução para isso é envolver seu
findOne
código em um IFFE (Expressão de Função Imediatamente Invocada). Este código será concluído antes de passar para a próxima cerveja de beerObject. Aqui estão mais algumas informações sobre o IFFE
Stack Overflow em IFFE
Dei uma passada rápida no código, acredito que deve funcionar, mas talvez seja necessário fazer alguns ajustes com o 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);
}