节点& Mongoose - 保存时出错:TypeError:在非对象上调用Object.keys

时间:2014-08-27 19:23:52

标签: node.js express mongoose

在下面的用户架构中有一个foobar.events字段,我试图将新的哈希值(从API POST请求中接收)推送到。

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    
        }]
    }

});

以下是Express路线的逻辑:

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

find方法成功执行,但在尝试保存到数据库时抛出以下错误:Error on save: TypeError: Object.keys called on non-object - 知道为什么会抛出此错误?

This thread had a similar problem,但将findOne更改为findById会破坏我的用户查询。

作为旁注,这是API中req.body返回的内容:

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

以下是User.findOne方法

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

2 个答案:

答案 0 :(得分:5)

此错误实际上是由于Mongo数据库中的旧数据造成的。 events字段中充满了额外的字符串。我删除了这些,我的原始代码开始成功运行。不需要修改上述代码。

答案 1 :(得分:1)

我尝试了你的代码并且它完美地工作..对我来说..尝试检查mongoose模块版本或者什么。如果你还有问题请使用更新功能而不是保存它。它会更加注重性能。< / p>

这是以下我用的

    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");
                }
            });
        });