Mongoose如何为所有查询中间件统一执行Middleware函数
Mongoose 通用查询中间件实现说明
Mongoose 原生不支持使用*通配符批量匹配所有查询方法的中间件注册写法,直接写mySchema.pre('*', 回调函数)无法达到所有查询方法触发时执行逻辑的效果。
想要避免逐个方法写重复中间件的冗余问题,直接遍历所有需要挂载的查询方法名,批量注册同一个处理函数就行,实现非常简单。
具体实现代码
先把所有需要挂载中间件的查询方法整理成数组,再循环给每个方法绑定同一个前置钩子:
// 查询中间件支持的全量方法列表 const queryMethods = [ 'count', 'countDocuments', 'deleteMany', 'deleteOne', 'estimatedDocumentCount', 'find', 'findOne', 'findOneAndDelete', 'findOneAndRemove', 'findOneAndReplace', 'findOneAndUpdate', 'remove', 'replaceOne', 'update', 'updateOne', 'updateMany' ] // 通用中间件逻辑,所有查询方法触发前都会执行 const commonPreMiddleware = function(next) { const query = this console.log("通用查询前置中间件已触发") // 这里写你的公共逻辑 next() } // 批量注册 queryMethods.forEach(methodName => { mySchema.pre(methodName, commonPreMiddleware) })
补充说明
- 如果不需要给全量查询方法挂载公共逻辑,直接增删数组里的方法名即可,灵活度比固定的通配符更高
- 中间件逻辑末尾必须调用
next(),否则会卡住整个查询流程 - 批量注册的中间件和单独给单个方法注册的表现完全一致,内部
this依旧指向当前查询实例,没有上下文差异
内容的提问来源于stack exchange,提问作者Islam Y-
相关产品推荐
相关产品推荐

