Das Problem hier ist das in findOne
Rückruf - Ihre beerId
wird immer auf das letzte Bier in beerObjects
gesetzt , weil die Schleife endet, bevor Sie zu Ihrem ersten Callback kommen - willkommen bei asynchronem Javascript.
Abhilfe schafft hier das Wrappen von findOne
Code in einem IFFE (Immediately Invoked Function Expression). Dieser Code wird vervollständigt, bevor mit dem nächsten Bier von beerObject fortgefahren wird.
Hier finden Sie weitere Informationen zu IFFE
Ich habe mir den Code kurz angesehen, ich glaube, das sollte funktionieren, aber Sie müssen möglicherweise einige Anpassungen am internen Code vornehmen ...
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);
}