试图用Mongoose更新对象给TypeError:Object#<Object>没有方法'保存'
为什么这段代码产生一个TypeError: Object #<Object> has no method 'save'
? project
对象存在并且是单数的。
/** Update project */ exports.update = function (req, res, next) { var projectId = req.params.id; Project.findById(projectId, function (err, project) { if (project) { project.screens[0] = project.screens[0] || {}; project.screens[0].name = 'Test screen'; project.screens[0].data = req.body.data; project.save(function(err) { if (err) { res.json(500, err); } else { res.json(200, 'Update complete'); } }); } else { res.json(404, 'PROJECT_NOT_FOUND'); } }); };
架构:
'use strict'; var mongoose = require('mongoose'), Schema = mongoose.Schema; var ProjectSchema = new Schema({ name: String, slug: String, dateCreated: Date, dateUpdated: Date, createdByUserId: Schema.Types.ObjectId, screens: [ { name: String, data: Schema.Types.Mixed } ] //awesomeness: Number //Schema.Types.Mixed // ProjectSchema.methods.greet = function() { return 'Hello, ' + this.name; }; }); mongoose.model('Project', ProjectSchema);
在project.save
之前输出控制台:
Logged 'project': { name: 'My First Project', slug: 'my-first-project', dateCreated: Wed Jan 29 2014 22:26:22 GMT+0100 (CET), _id: 52e971fe003687a492000002, __v: 0, screens: [ { data: 'testWeld', name: 'Test screen' } ] }
我刚刚完成debugging相同症状的问题。
在你的模式中,你有以下mongoose子文档:
screens: [ { name: String, data: Schema.Types.Mixed } ]
我同意你的观点,如果以下步骤奏效,这将是直观的:
project.screens[0] = project.screens[0] || {}; project.screens[0].name = 'Test screen'; project.screens[0].data = req.body.data; project.save(function(err)
但是,在重新阅读mongoose文档( Mongoose subdocs )之后,需要使用相应的apis来添加子文档,因为有一些正在进行的投射/额外工作。
例如,这摆脱了错误信息:
project.screens.push({ name: 'Test screen', data: req.body.data });
希望能帮助别人。
以前没有看到树林。 很高兴你发布日志输出,因为现在很明显东西正在logging。 保存要么没有参数或三个元素的callback,你可以在文档中看到。
所以你的代码应该更像
// project.save(err) { <-- is an object and not a callback project.save(function(err, project, numAffected) { if (err) { res.json(500, err); } else { res.json(200, 'Update complete'); } });
整个对象#<对象>是因为根本没有引用。 希望清除它。