【问题标题】:Nodejs/Mongoose pass a variable to mongoose functionNodejs/Mongoose 将变量传递给 mongoose 函数
【发布时间】:2023-03-05 06:51:01
【问题描述】:

我是 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() 语句输出了正确的信息。但是在 Mongoose 函数 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)。

【问题讨论】:

  • i 变量定义超出范围,您应该在本地执行或将 id 存储在函数 local var 中:var id = beerObjects[i].id;

标签: javascript node.js mongodb mongoose


【解决方案1】:

您需要使用 _id 而不是 id :

newBeer._id = data[i]['id'];
newBeer.name = data[i]['name'];

【讨论】:

  • 还是不行。我创建了一个名为“id”的字段,它是啤酒的 id。 '_id' 不同,那是 mongodb id。所以不是newBeer的问题,是beerObjects的问题。
【解决方案2】:

编辑:

您正在使用beerObject[i].id 循环并“获取”啤酒,然后异步检查计数,当您开始设置 newBeer.id 时,您处于不同的范围内。对此的补救措施是将变量设置为 beerObject[i].id 并将其作为您在 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

【讨论】:

  • 与其他答案相同。还是不行。我创建了一个名为“id”的字段,它是啤酒的 id。 '_id' 不同,那是 mongodb id。所以不是newBeer的问题,是beerObjects的问题。
  • 是的,这解决了我原来的问题,但现在我遇到了另一个问题。只有列表中的最后一个啤酒被添加到我的数据库中。假设列表长度为 10。它将相同啤酒的 10 个副本添加到数据库中。
  • 我现在正在使用 findOne,但它仍然无法正常工作。我什至尝试匹配名称而不是 id,但它仍在添加重复项。并且 for 循环仍然循环几次,只用最后一瓶啤酒。
  • 是的,我把它放到了一个新函数中。看看编辑过的问题。
【解决方案3】:

MongoDB ID 是自动生成的,因此您无法将任何值添加到 _id 属性中,除非您在 mongoose 模型中将 _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 和你的函数中的newBeer._id = beerObjects[i]id。我希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2015-04-08
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多