【问题标题】:Mongoose error - no 'toObject' method after upgradeMongoose 错误 - 升级后没有“toObject”方法
【发布时间】:2015-07-10 22:25:36
【问题描述】:

我有一个 Mongoose 模型,我在其中调用了钩子中的 toObject 方法:

Product.post('init', function() {
   // if (typeof this.toObject === 'function') - works but why do I need it?
    this._original = this.toObject();
});

这在过去运行良好,但在 Mongoose 升级后抛出此错误:

TypeError: Object #<EventEmitter> has no method 'toObject'
at EventEmitter.Product.pre.self (/opt/run/snapshot/package/models/product.js:426:25)
at EventEmitter.emit (events.js:95:17)
at model.Document.(anonymous function) [as emit] (/opt/run/snapshot/package/node_modules/mongoose/lib/document.js:88:42)
at model.Document.init (/opt/run/snapshot/package/node_modules/mongoose/lib/document.js:271:8)
at completeMany (/opt/run/snapshot/package/node_modules/mongoose/lib/query.js:1075:12)
at Object.cb (/opt/run/snapshot/package/node_modules/mongoose/lib/query.js:1030:11)
at Object._onImmediate (/opt/run/snapshot/package/node_modules/mongoose/node_modules/mquery/lib/utils.js:137:16)
at processImmediate [as _immediateCallback] (timers.js:345:15)

我应该注意到,这发生在启动应用程序时。我可以进行检查以防止错误,但问题是我需要 toObject 函数并且想了解如何引发此错误。

我没有找到有关任何更改的文档。有什么想法吗?

编辑我意识到我的问题是由松散的 package.json Mongoose 规范引起的,这导致我的主机 (nodejitsu) 使用我认为是 4.x 的版本而不是我的本地 @987654327 @ 分支。如果我完全锁定版本,则不会出现问题。

【问题讨论】:

  • 您能告诉我们您是如何定义 Post 架构的,包括为其模型定义的任何实例和静态方法吗?
  • 鉴于您的typeof 检查,我看不出该代码有任何方法抛出该错误。你确定这是引发异常的代码吗?
  • @JohnnyHK - 很抱歉 - 这是我为防止错误而添加的检查 - 已编辑帖子。如果我进行 typeof 检查,则没有错误,但我需要的功能不起作用。
  • 好吧,这与使用 Mongoose 4+ 的柔术有关。一位用户发布了答案,但随后将其删除。 Mongoose 4 钩不同。锁定版本就行了——我有旧风格^。
  • 我删除了我的答案,因为我意识到 _original 值没有持续到后面的钩子中。我将我的代码附加到 Github 上的一个未解决问题中。 github.com/Automattic/mongoose/issues/2363

标签: node.js mongodb mongoose


【解决方案1】:

在最新版本 3.8.x 和 4.0 之间的某个地方,帖子 init 挂钩已更改,但未记录在案。在更改之前this 引用了当前文档,但现在this 是触发挂钩调用的事件发射器。访问当前文档的新方法是向钩子函数添加一个参数,就像之前的 saveremove 钩子一样。

schema.post('init', function(doc) {
    doc._original = doc.toObject();
});

不幸的是,由于此更改,添加到文档中的任何非架构属性似乎都在 post init 和 pre save 挂钩之间丢失,因此目前无法修复此问题。

我上周五在 Github 上打开了一个问题 (#2952)。目前有 387 个未解决的问题,所以我不确定这会多快得到解决。如果我有任何消息,我会发布更新。

【讨论】:

  • 很高兴知道 - 但是我在 3.8 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多