【问题标题】:Push an object into an object's array将对象推入对象的数组
【发布时间】:2016-05-09 05:46:17
【问题描述】:

所以我试图在创建后将新的 Item 对象推送到 ToDo 对象中。完成后,我似乎无法将新项目添加到待办事项中。

这是我的两个架构:

var mongoose = require('mongoose');
  var Item = new mongoose.Schema({
  ItemName : String,
  todo: { type: mongoose.Schema.Types.ObjectId, ref: 'Todo'}
});
mongoose.model('Item', Item);

var mongoose = require('mongoose');
  var ToDo = new mongoose.Schema({
  ToDoName : String,
  items: [ {item : { type: mongoose.Schema.Types.ObjectId, ref: 'Item'}}]
});
mongoose.model('ToDo', ToDo);

我确定我的 app.post 创建项目有问题:

app.post('/todos/:todo_id/items', function(req, res, next) {

    Item.create({
        //_id : req.body.item_id,
        ItemName : req.body.ItemName,
        todoId : req.params.todo_id
    }, function(err, item) {
        if (err)
            res.send(err);

        // get and return all the items after you create another
        Item.find(function(err, items) {
            if (err)
                res.send(err)
            res.json(items);
        }); 

        item.save(function(err, item){
            if(err){ return next(err); }

        ToDo.items.push(item);
        ToDo.save(function(err, todo) {
            if(err){ return next(err); }

        res.json(item);
         });
        });

        }); 
    });

我尝试了几种不同的解决方案,但通常会收到错误消息:“无法读取未定义的属性 'push'。”我真正需要做的就是将新项目添加到当前 ToDo 的 items 数组中。如果有人有任何想法,我将不胜感激!

提前致谢,

奎因

【问题讨论】:

    标签: javascript node.js express mongoose mean-stack


    【解决方案1】:

    您的代码不正确,您有多个响应,除了第一个响应之外,它们都不会执行,expressjs 会抛出异常,例如 cannot modify sent headers,据我了解,您想创建项目,将其添加到待办事项中,并从该待办事项中获取所有项目。下面的代码应该可以帮助你

    app.post('/todos/:todo_id/items', function(req, res, next) {
    
        Item.create({
            ItemName : req.body.ItemName,
            todoId : req.params.todo_id
        }, function(err, item) {
            if (err)
                res.send(err);
            else {
                //push to proper ToDo
                ToDo.update({_id: req.params.todo_id}, {$push: { items: item }}, function(updateError, updateResponse){
                    if(updateError) {
                        res.send(updateError);
                    } else {
                        //find all items that have exact todo_id
                        Item.find({todo: req.params.todo_id}, function(findError, foundItems) {
                            if(findError) {
                                res.send(findError)
                            } else {
                                res.json(foundItems);
                            }
                        });
                    }
                });
            }
        });
    }
    

    【讨论】:

    • 你是绝对的救星!这解决了我的问题,非常感谢!
    【解决方案2】:

    这可能是因为您试图修改与 JavaScript 对象不同的 mongoose 文档。将 .lean() 附加到您的 find 调用以接收常规 JavaScript 对象。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 2023-03-29
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2011-02-13
      • 2012-10-21
      • 2015-10-19
      相关资源
      最近更新 更多