将对象推入对象数组

Push an object into an object's array

所以我试图在创建新的 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);
         });
        });

        }); 
    });

我尝试了几种不同的解决方案,但通常会出现错误:"Cannot read property 'push' of undefined."我真正需要做的就是将新项目添加到当前待办事项的项目数组中。如果有人有任何想法,我将不胜感激!

提前致谢,

奎恩

可能是因为您正在尝试修改不同于 JavaScript 对象的 mongoose 文档。将 .lean() 附加到您的查找调用以接收常规 JavaScript 对象。

您的代码不正确,您有多个响应,其中 none 个将永远执行,除了第一个,expressjs 将抛出异常 无法修改已发送 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);
                        }
                    });
                }
            });
        }
    });
}