[英]Nodejs/Mongoose pass a variable to mongoose function
我是Node.js和Mongoose的新手,需要一些幫助。 因此,我首先創建一個名為beerObjects的數組。 然后,我向breweryDB請求並將信息存儲在此數組中。
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數據庫中。
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
}
});
}
}
在addBeerToDatabase()函數的開頭,定義了beerObject,console.log()語句輸出正確的信息。 但是在貓鼬函數Beer.count()中,我收到了此錯誤消息。
newBeer.id = beerObjects[i].id;
TypeError: Cannot read property 'id' of undefined
此“ id”是beerObjects [i]的ID,而不是newBeer。 如何正確將beerObjects傳遞給mongoose函數並在該函數中使用它?
編輯:
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)。
您需要使用_id而不是id:
newBeer._id = data[i]['id'];
newBeer.name = data[i]['name'];
編輯:
您正在遍歷並使用beerObject[i].id
來“抓取”啤酒,然后異步檢查計數,直到您開始設置newBeer.id時,您才處於不同的范圍。 對此的補救措施是將一個變量設置為beerObject[i].id
並將其作為您在Beer.count
尋找的“啤酒” Beer.count
:
像這樣:
for (i = 0; i < beerObjects.length; i++) {
console.log(beerObjects[i].id);
var checkBeer = beerObjects[i]
// check if beer is already in database
Beer.count({id: checkBeer.id}, function(err, count){
if (err) {
handleError(err);
}
if (count == 0) {
// add new beer to database
var newBeer = new Beer();
newBeer.id = checkBeer.id;
... and so on
MongoDB ID是自動生成的,因此除非在貓鼬模型中將_id
定義為String,否則您不能將任何值添加到_id
屬性中。
例如。
var mongoose = require('mongoose');
var beerSchema = new mongoose.Schema({
_id: String,
name: String,
// rest of beer properties
});
module.exports = mongoose.model('Beer', beerSchema);
在您的功能內,
function addBeersToDatabase(beerObjects) {
for (i = 0; i < beerObjects.length; i++) {
Beer.findbyId(beerObjects[i].id, function(err, beers){
if (beers.lenght == 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();
}
else {
// beer is already in database
}
});
}
如果要使用默認的mongoId,則只需從函數中刪除_id: String
模型中的_id: String
和newBeer._id = beerObjects[i]id
。 希望對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.