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

时间:2015-05-01 02:42:37

标签: node.js mongodb mongoose

我有一个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分行。如果我确切地锁定版本,则不会发生问题。

1 个答案:

答案 0 :(得分:2)

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

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

不幸的是,由于此更改,添加到文档的任何非架构属性在帖子initsave之前的钩子之间似乎都会丢失,所以没有办法现在解决这个问题。

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