所以我试图在创建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数组中。如果有人有任何想法我会非常感激!
提前致谢,
昆
答案 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);
}
});
}
});
}
});
}