Anconia
Anconia

Reputation: 4028

Node & Mongoose - Error on save: TypeError: Object.keys called on non-object

In the below user schema there is a foobar.events field, that I am trying to push new hashes (that are received from an API POST request) to.

var userSchema = mongoose.Schema({

    foobar: {
        id           : String,
        token        : String,
        email        : String,
        name         : String,
        events       : [{
            action          : String,
            timestamp       : Date,
            user_xid        : String,
            type            : {type: String},
            event_xid       : String    
        }]
    }

});

And here is the logic for that Express route:

app.post('/foobar/post', function(req, res) {
    var jb_user_xid  = req.body['events'][0]['user_xid'];
    var jb_timestamp = req.body['events'][0]['timestamp'];
    var jb_action    = req.body['events'][0]['action'];
    var jb_type      = req.body['events'][0]['type'];
    var jb_event_xid = req.body['events'][0]['event_xid'];

    User.findOne({'foobar.id':jb_user_xid}, function(err, user) {
        console.log(user);
        user.foobar.events.push({
            user_xid: jb_user_xid,
            timestamp: jb_timestamp,
            action: jb_action,
            type: jb_type,
            event_xid: jb_event_xid
        });
        user.save(function(err) {
            if (err){ 
                console.log("Error on save: " + err);
            }
            else {
                console.log("Save successful");
            }
        });
    });

    res.writeHead(200);
    res.end();
    return;
});

The find method is executed successfully, but the following error is thrown when trying to save to the database: Error on save: TypeError: Object.keys called on non-object - any idea why this error is being thrown?

This thread had a similar problem, but changing the findOne to findById broke my user query.

As a side note, this is what is returned in req.body from the API:

{  events:
    [ { action: 'updation',
        timestamp: 1408846680,
        user_xid: 'aguxwNqb_Xg87buMyP6Wiw',
        type: 'move',
        event_xid: 'vhAkgg1XwQvLynAkkCc8Iw' } ],
   notification_timestamp: 1408846680 }

And here is what's returned from the User.findOne method

{ __v: 17,
   _id: 53f7d23e432de20200970c10,
   foobar:
    { id: 'aguxwNqb_Xg87buMyP6Wiw',
      name: 'Test User',
      token: 'W3AjaI7_iOWilcKRpmxenQWi',
      events: [] }
}

Upvotes: 5

Views: 2065

Answers (2)

Anconia
Anconia

Reputation: 4028

This error was actually due to old data within my Mongo database. The events field was full of extra strings. I deleted these and my original code began working successfully. No changes to the above code were necessary.

Upvotes: 5

vimalpt
vimalpt

Reputation: 543

I tried your code and it works perfectly.. for me.. try to check mongoose module version or something.if u have still problem please do it using update function rather than save..It would be more performance oriented.

this is the following i used

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test');
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function callback () {
      // yay!
    });
    var userSchema = mongoose.Schema({

        foobar: {
            id           : String,
            name         : String,
            events       : [{
                action          : String,
                timestamp       : Date,
                user_xid        : String,
                type            : {type: String},
                event_xid       : String    
            }]
        }

    });







    var User =  mongoose.model('user', userSchema);

    /*
    //used for saving.
    var person =  new User({  foobar:
        { id: 'aguxwNqb_Xg87buMyP6Wiw',
          name: 'Test User',
          token: 'W3AjaI7_iOWilcKRpmxenQWi',
          events: [] }
    });
    person.save(function(err,data){
    console.log(err);
    console.log(data);
    })

    */


    User.findOne({'foobar.id':'aguxwNqb_Xg87buMyP6Wiw'}, function(err, user) {
            console.log(user);
            user.foobar.events.push({ action: 'updation',
            timestamp : 1408846680,
            user_xid: 'aguxwNqb_Xg87buMyP6Wiw',
            type: 'move',
            event_xid: 'vhAkgg1XwQvLynAkkCc8Iw' });
            user.save(function(err) {
                if (err){ 
                    console.log("Error on save: " + err);
                }
                else {
                    console.log("Save successful");
                }
            });
        });

Upvotes: 1

Related Questions