为什么此代码会产生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' } ] }
答案 0 :(得分:2)
我刚刚完成调试具有相同症状的问题。
在您的架构中,您有以下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)之后,需要使用适当的api添加子文档,因为有一些正在进行的转换/额外工作。
例如,这消除了错误消息:
project.screens.push({ name: 'Test screen', data: req.body.data });
希望能有所帮助。
答案 1 :(得分:0)
之前没有看到森林的树木。很高兴你发布了日志输出,因为现在很明显有些东西正在记录。保存不带参数或三元素回调,您可以在documentation中看到。
所以你的代码应该更像:
// 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');
}
});
整个对象#&lt;对象&gt;事情是因为根本没有参考。希望能搞清楚。