在更新后的中间件中找到不正确的文档修订号

时间:2016-02-21 18:22:41

标签: node.js mongodb mongoose mongodb-query mongoose-plugins

我有一个Mongoose插件,我用它来增加文档修订号(__v),以及创建修订本身。该插件涵盖了文档Doc.save()中间件功能,以及查询updatefindOneAndUpdate中间件功能。

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值会增加,并且还会创建修订文档。我坚持的部分与查询中间件功能updatefindOneAndUpdate有关。即使__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
    })
})

但很明显,这只是一个绑带,所以如果真的能解决这个问题,那就太棒了

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  

即使__v通过事件在文档中得到更新,帖子事件中的this.__v值似乎也看不到更新后的值

这很可能是因为updatefindOneAndUpdate的中间件不使用异步回调等待操作完成后再继续( 为<{1}}中间件做了实现。

所以让它使用回调:

save