Mongoose 错误 - 升级后没有 'toObject' 方法
Mongoose error - no 'toObject' method after upgrade
我有一个 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
版本而不是我本地的 3.8.x
分支。如果我准确锁定版本,问题就不会发生。
在后期版本 3.8.x 和 4.0 之间的某个地方,post init
挂钩已更改,但未记录在案。在更改之前 this
引用当前文档,但现在 this
是触发挂钩调用的事件发射器。访问当前文档的新方法是在钩子函数中添加一个参数,就像前面的 save
和 remove
钩子一样。
schema.post('init', function(doc) {
doc._original = doc.toObject();
});
不幸的是,由于此更改,添加到文档中的任何非模式属性似乎都在 post init
和 save
前挂钩之间丢失,因此没有现在解决这个问题的方法。
我在上周五 Github 开了一个问题 (#2952)。目前有 387 个未解决的问题,所以我不确定这能多快得到解决。如果我听到任何消息,我会 post 更新。
我有一个 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
版本而不是我本地的 3.8.x
分支。如果我准确锁定版本,问题就不会发生。
在后期版本 3.8.x 和 4.0 之间的某个地方,post init
挂钩已更改,但未记录在案。在更改之前 this
引用当前文档,但现在 this
是触发挂钩调用的事件发射器。访问当前文档的新方法是在钩子函数中添加一个参数,就像前面的 save
和 remove
钩子一样。
schema.post('init', function(doc) {
doc._original = doc.toObject();
});
不幸的是,由于此更改,添加到文档中的任何非模式属性似乎都在 post init
和 save
前挂钩之间丢失,因此没有现在解决这个问题的方法。
我在上周五 Github 开了一个问题 (#2952)。目前有 387 个未解决的问题,所以我不确定这能多快得到解决。如果我听到任何消息,我会 post 更新。