Mongoose错误 - 升级后没有'toObject'方法

4

我有一个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 函数,希望了解如何抛出此错误。

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

编辑 我意识到我的问题是由于 Mongoose 的松散的 package.json 规范导致的,这导致我的主机(nodejitsu)使用了我认为是 4.x 版本而不是本地的 3.8.x 分支。如果我精确锁定版本,则不会发生问题。


你能展示一下如何定义Post模式,包括任何已定义的实例和静态方法吗? - chridam
根据你的 typeof 检查,我看不出那段代码会抛出那个错误。你确定是那段代码引起了异常吗? - JohnnyHK
@JohnnyHK - 很抱歉 - 这是我添加的一个检查,以防止错误 - 已编辑帖子。如果我进行 typeof 检查,则不会出现错误,但我需要的功能将无法正常工作。 - cyberwombat
好的,这与Jitsu使用Mongoose 4+有关。一个用户发布了答案,但后来将其删除了。Mongoose 4钩子是不同的。锁定版本就解决了问题 - 我使用了旧样式^。 - cyberwombat
@Yashua 我更新了我的旧答案并将其恢复。如果我得到关于这个 Bug 的回复,我会告诉你的。谢谢! - Brian Shamblen
显示剩余2条评论
1个回答

5

在3.8.x的晚期版本和4.0之间,文章init钩子已经发生了改变,但是并没有进行文档记录。在更改之前,this引用当前文档,但现在this是触发钩子调用的事件发射器。获取当前文档的新方法是通过向钩子函数添加参数来实现的,与预先定义的saveremove钩子类似。

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

很不幸,自从这个改变之后,任何添加到文档中的非模式属性似乎都会在init后和save前的钩子之间丢失,所以目前没有办法解决这个问题。

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


1
好知道 - 不过我使用的是3.8版本。 - cyberwombat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接