我有一个Mongoose插件,我用它来增加文档修订号(__v
),以及创建修订本身。该插件涵盖了文档Doc.save()
中间件功能,以及查询update
和findOneAndUpdate
中间件功能。
module.exports = ( schema, options ) => {
_.forEach( [ 'save','update', 'findOneAndUpdate' ], query => {
// Since the Doc.save() middleware is the only document update middleware function, just isolate that one
if( query === 'save' )
schema.pre( query, function( next ) {
this.increment()
next()
} )
// The rest are query updates
else
schema.pre( query, function() {
this.update( {}, { $inc: { __v: 1 } } )
})
// Create revisions for each document update
schema.post( query, docData => {
Mongoose.models.Revision.createRevision( {
docsId: this._id,
revision: docData.__v, // <-- This is the wrong number. It's one less than it should be
document: { /* Stuff.. */ }
// More stuff
}, ( err, revision ) => {
// CB Stuff
})
})
})
}
所以这大部分按预期工作。对于文档和查询交互,文档的__v
值会增加,并且还会创建修订文档。我坚持的部分与查询中间件功能update
和findOneAndUpdate
有关。即使__v
通过预事件在文档中更新,帖子事件中的this.__v
值似乎也不会看到更新的值。这意味着将创建修订并引用文档的错误修订号。
这只是非常奇怪,因为文档__v
确实实际上在我在数据库中查看它时会更新,但是当我 console.log 帖子中的this.__v
update
..它会在更新之前看到修订号。
对于临时修复,我只是手动递增它,如果它是一个查询MW函数:
schema.post( query, docData => {
Mongoose.models.Revision.createRevision( {
docsId: this._id,
revision: ( query === 'save' // Temporary fix..
? docData.__v
: docData.__v+1 ) // Add +1 if its a query function
document: { /* Stuff.. */ }
// More stuff
}, ( err, revision ) => {
// CB Stuff
})
})
但很明显,这只是一个绑带,所以如果真的能解决这个问题,那就太棒了
有什么想法吗?
答案 0 :(得分:1)
即使
__v
通过预事件在文档中得到更新,帖子事件中的this.__v
值似乎也看不到更新后的值
这很可能是因为update
和findOneAndUpdate
的中间件不使用异步回调等待操作完成后再继续( 为<{1}}中间件做了实现。
所以让它使用回调:
save