将对象推入对象的数组中

时间:2016-01-31 20:48:57

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

所以我试图在创建ToDo对象后将其推送到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数组中。如果有人有任何想法我会非常感激!

提前致谢,

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你的代码是不正确的,你有多个响应,除了第一个,它们都不会执行,expressjs将抛出异常,如无法修改发送的标题,据我所知,你想要创建项目,将它添加到todo,并从该待办事项中获取所有项目。以下代码可以帮助您

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);
                        }
                    });
                }
            });
        }
    });
}