NestJS中Prisma中间件的最佳放置位置是哪里?
方案可行性说明
该方案完全可行,在NestJS项目中将Prisma中间件定义在prisma.service.ts内,是比在main.ts全局添加更符合模块化设计、可维护性更高的实现方式。
最佳放置位置
Prisma中间件需要和PrismaClient实例绑定,因此最佳注册位置是PrismaService的构造函数内,在实例初始化阶段就完成中间件注册,早于数据库连接和所有请求处理逻辑,完全符合Prisma中间件的生效要求,不会出现不生效的问题。
修改后代码示例
@Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { constructor() { // 初始化PrismaClient配置 super(); // 在此处注册所有Prisma中间件 this.$use(async (params, next) => { // 示例中间件逻辑:统计查询耗时 const startTime = Date.now(); const result = await next(params); console.log(`Prisma查询 ${params.model}.${params.action} 耗时:${Date.now() - startTime}ms`); return result; }); } async onModuleInit() { await this.$connect(); } async enableShutdownHooks(app: INestApplication) { this.$on('beforeExit', async () => { await app.close(); }); } }
该实现的优势
- 中间件和PrismaService实例强绑定,不会出现
main.ts中注册时,给额外实例化的PrismaClient加了中间件、Nest依赖注入容器内的实例没生效的问题 - 所有Prisma相关配置聚合在同一个服务文件内,符合高内聚的设计原则,后续维护中间件不需要跨文件修改
- 注册时机早于所有数据库查询请求,不存在中间件漏生效的场景
注意:不要将中间件注册逻辑放在
onModuleInit或者请求生命周期相关的钩子内,否则部分早于钩子执行的查询可能无法命中中间件。
内容的提问来源于stack exchange,提问作者zedian
相关产品推荐
相关产品推荐

