在 post 更新中间件中发现不正确的文档修订号
Incorrect document revision number found in post update middleware
我有一个 Mongoose 插件,我用它来增加文档修订号 (__v
),以及创建修订本身。该插件涵盖了 Documents Doc.save()
中间件功能,以及 Query 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
通过 pre 事件在文档中更新,post[=42 中的 this.__v
值=] 事件似乎没有看到更新的值。所以这意味着修订被创建并引用了错误的文档修订号。
这太奇怪了,因为当我在数据库中查看文档 __v
确实 实际上会更新,但是当我 console.log post update
中的 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
})
})
但显然,这只是一个创可贴,所以如果真的能解决这个问题,那就太好了
有什么想法吗?
Even though the __v
gets updated in the document via the pre event, the this.__v
value in the post event doesn't seem to see the updated value.
这很可能是因为您的 update
和 findOneAndUpdate
的中间件没有使用异步回调来等待操作完成后再继续(您 所做的事情 save
中间件的实现)。
所以让它使用回调:
schema.pre( query, function(next) {
this.update( {}, { $inc: { __v : 1 } }, next);
})
我有一个 Mongoose 插件,我用它来增加文档修订号 (__v
),以及创建修订本身。该插件涵盖了 Documents Doc.save()
中间件功能,以及 Query 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
通过 pre 事件在文档中更新,post[=42 中的 this.__v
值=] 事件似乎没有看到更新的值。所以这意味着修订被创建并引用了错误的文档修订号。
这太奇怪了,因为当我在数据库中查看文档 __v
确实 实际上会更新,但是当我 console.log post update
中的 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
})
})
但显然,这只是一个创可贴,所以如果真的能解决这个问题,那就太好了
有什么想法吗?
Even though the
__v
gets updated in the document via the pre event, thethis.__v
value in the post event doesn't seem to see the updated value.
这很可能是因为您的 update
和 findOneAndUpdate
的中间件没有使用异步回调来等待操作完成后再继续(您 所做的事情 save
中间件的实现)。
所以让它使用回调:
schema.pre( query, function(next) {
this.update( {}, { $inc: { __v : 1 } }, next);
})