私はNode.jsとMongooseを初めて使用しており、何か助けが必要です。だから私はまずbeerObjectsという配列を作成します。次に、私はbreweryDBに要求を出し、この配列に情報を格納します。Nodejs/Mongooseは、変数をmongoose関数に渡します。
request(options, function (error, response, body) {
if (error) throw new Error(error);
obj = JSON.parse(body);
data = obj['data'];
for(i = 0; i < data.length; i++) {
var newBeer = new Beer();
newBeer.id = data[i]['id'];
newBeer.name = data[i]['name'];
newBeer.description = data[i]['description'];
newBeer.abv = data[i]['abv'];
if (data[i].hasOwnProperty('labels')) {
newBeer.image = data[i]['labels']['large'];
}
beerObjects.push(newBeer);
console.log(beerObjects[i].name);
}
addBeersToDatabase(beerObjects);
});
私はこの配列をとり、mongoデータベースに情報を格納する別の機能を持っています。
addBeerToDatabase()関数の先頭にfunction addBeersToDatabase(beerObjects) {
console.log(beerObjects.length);
for (i = 0; i < beerObjects.length; i++) {
console.log(beerObjects[i].id);
// check if beer is already in database
Beer.count({id: beerObjects[i].id}, function(err, count){
if (err) {
handleError(err);
}
if (count == 0) {
// add new beer to database
var newBeer = new Beer();
newBeer.id = beerObjects[i].id;
newBeer.name = beerObjects[i].name;
newBeer.description = beerObjects[i].description;
newBeer.abv = beerObjects[i].abv;
newBeer.image = beerObjects[i].image;
newBeer.save(function(err) {
if (err) {
throw err;
}
});
}
else {
// beer is already in database
}
});
}
}
、beerObjectが定義されているとはconsole.log()ステートメントの出力正しい情報。しかし、Mongoose関数Beer.count()の中で、私はこのエラーメッセージを受け取ります。
newBeer.id = beerObjects[i].id;
TypeError: Cannot read property 'id' of undefined
この 'id'は、newBeerではなくbeerObjects [i]のIDです。どのように正しくmongoose関数にbeerObjectsを渡して、その関数で使うのですか?
EDIT:
function addBeersToDatabase(beerObjects) {
for (i = 0; i < beerObjects.length; i++) {
console.log(beerObjects[i].beerId);
var currentBeer = beerObjects[i];
// check if beer is already in database
Beer.findOne({'beerId': currentBeer.beerId}, function(err, beer){
if (err) {
handleError(err);
}
if (beer) {
// beer is already in database
}
else {
// add new beer to database
console.log(currentBeer.name);
saveNewBeer(currentBeer);
}
});
}
}
function saveNewBeer(currentBeer) {
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) {
if (err) {
throw err;
}
});
}
このコードはbeerObjectsわずか最後の項目のn個の複製(N = beerObjects.length)を添加します。
'i'変数はスコープの外に定義されていますので、ローカル変数を使用するか、関数内の' id'をストアしてください。var: 'var id = beerObjects [i] .id;' – alexmac