试图用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'); } }); 

整个对象#<对象>是因为根本没有引用。 希望清除它。