Attempting to update an object using Mongoose gives TypeError: Object # <Object> does not have a 'save' method

Why is this code creating TypeError: Object #<Object> has no method 'save'? The object projectexists and is the only one.

/** 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');
        }
    });
};

Scheme:

'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);

Console output before 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' } ] }
+4
source share
2 answers

I just finished debugging a problem with the same symptoms.

In your schema, you have the following mongoose subdocument:

screens: [ { name: String, data: Schema.Types.Mixed } ]

I agree with you that it would be intuitive if the following steps were taken:

project.screens[0] = project.screens[0] || {};
project.screens[0].name = 'Test screen';
project.screens[0].data = req.body.data;

project.save(function(err) 

(Mongoose subdocs) apis , / , .

, :

project.screens.push({ name: 'Test screen', data: req.body.data });

, -.

+2

. , , , - . , , .

, :

// 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');
    }
});

# < > , . , .

0

Source: https://habr.com/ru/post/1524381/


All Articles