尝试使用Mongoose更新对象会产生TypeError:Object#<object>没有方法&#39; save&#39; </object>

时间:2014-01-29 21:37:30

标签: node.js mongoose

为什么此代码会产生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' } ] }

2 个答案:

答案 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;事情是因为根本没有参考。希望能搞清楚。