将对象推入对象数组
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);
}
});
}
});
}
});
}
所以我试图在创建新的 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);
}
});
}
});
}
});
}