在下面的用户架构中有一个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: [] }
}
答案 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");
}
});
});