【问题标题】:TypeError: Object.keys called on non-object when updating documentTypeError:更新文档时在非对象上调用 Object.keys
【发布时间】:2014-04-10 19:28:19
【问题描述】:

我正在尝试通过递增计数器并将对象推送到数组来更新现有文档。

这是用户的架构:

var UserSchema = new Schema({
  [...]
  posts: {
    totalWords: { type: Number, min: 0, default: 0 },
    _entries: [
      {
        words: { type: Number, min: 0 },
        body: { type: String },
        date: Date
      }
    ]
  },
});

这是更新代码:

var newPost = {
  words: req.body.words,
  body: req.body.entry,
  date: new Date()
};

User.findOne(req.user._id, function (err, user) {
  var previous = user.posts.totalWords;
  user.posts.totalWords = previous + newPost.words;
  user.posts._entries.push(newPost);

  user.save(function (err) {
    if (err) return res.send(400, err);
    return res.json(newPost);
  });
});

我收到以下错误:

[TypeError: Object.keys called on non-object]

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    回答我自己的问题

    我能够通过更改来解决问题:

    User.findOne(req.user._id, function (err, user) { [...] });
    

    进入这个:

    User.findById(req.user._id, function (err, user) { [...] });
    

    【讨论】:

      【解决方案2】:

      不确定findById()findOne() 的区别,但我在保存或更新格式错误的数据或与旧模式对应的数据时遇到了返回Object.keys called on non-object 的Mongoose 对象的问题。在初始化文档时,Mongoose 期待某种子文档,但数据库中的数据不匹配。

      对我来说,当我将架构从简单对象(StringNumber 等)更改为某种更复杂的子文档时,通常会发生这种情况。模式类型混合在一起,对象不会加载,甚至无法解决问题。我必须使用the native driver 进入我的数据库,使用$type 运算符搜索格式错误的文档,然后单独更新它们。

      【讨论】:

        【解决方案3】:

        我认为,如果您想使用 findOne,您需要遵循以下语法:

        User.findOne({'_id': req.user._id}, {}, function (err, user) { ... });

        【讨论】:

        • 这是正确的回答。目前在最新版本中存在一个错误(虽然标记为已修复),它们无法正确处理为 fields 属性传递 null
        • 可以传入一个空对象,或者修改collection.js的175行添加check
        猜你喜欢
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        • 1970-01-01
        相关资源
        最近更新 更多