Node&Mongoose – 保存时出错:TypeError:Object.keys在非对象上调用

在下面的用户架构中有一个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 – 任何想法为什么这个错误被抛出?

这个线程有一个类似的问题 ,但更改findOne findById打破了我的用户查询。

作为一个方面的说明,这是从API返回的req.body中的内容:

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

这里是从User.findOne方法返回的User.findOne

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

这个错误实际上是由于我的Mongo数据库中的旧数据。 events字段充满了额外的string。 我删除了这些,我的原始代码开始成功工作。 上述代码没有变化是必要的。

我试过你的代码,它的作品完美..对我来说..尝试检查mongoose模块版本或东西。如果你仍然有问题,请使用更新function,而不是保存..这将是更多的性能导向。

这是我以下使用

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