繁体   English   中英

Nodejs / Mongoose将变量传递给Mongoose函数

[英]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: StringnewBeer._id = beerObjects[i]id 希望对您有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM