NestJs中PrismaService的onModuleInit多次调用问题解决
解决Nest.js中PrismaService的onModuleInit被多次调用的问题
问题原因
你在AppModule和CsvParsersModule的providers数组中都注册了PrismaService,而Nest.js默认会为每个模块中注册的Provider创建独立实例,这就导致PrismaService被实例化两次,onModuleInit方法自然会执行两次,同时还会创建多余的数据库连接,浪费资源。
解决方案
方法一:将PrismaService封装为全局模块
这是最规范且常用的方式,适合全局复用的服务:
完善PrismaModule
在你的prisma.module.ts中,将模块标记为全局,并导出PrismaService:import { Global, Module } from '@nestjs/common'; import { PrismaService } from './prisma.service'; @Global() @Module({ providers: [PrismaService], exports: [PrismaService], }) export class PrismaModule {}修改AppModule
在AppModule中导入PrismaModule,同时移除自身providers中的PrismaService:import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { CsvParsersModule } from './csv-parsers/csv-parsers.module'; import { PrismaModule } from './prisma/prisma.module'; @Module({ imports: [PrismaModule, CsvParsersModule], controllers: [AppController], providers: [AppService] }) export class AppModule {}修改CsvParsersModule
移除providers中的PrismaService,后续直接在需要的地方注入即可:import { Module } from '@nestjs/common'; import { CsvParsersService } from './csv-parsers.service'; import { CsvParsersController } from './csv-parsers.controller'; @Module({ controllers: [CsvParsersController], providers: [CsvParsersService], exports: [CsvParsersService] }) export class CsvParsersModule {}
方法二:单模块注册+导出(备选)
如果不想用全局模块,也可以只在AppModule中注册PrismaService并导出,其他模块通过导入AppModule来复用:
// 修改AppModule @Module({ imports: [CsvParsersModule], controllers: [AppController], providers: [AppService, PrismaService], exports: [PrismaService] }) export class AppModule {}
然后在CsvParsersModule中导入AppModule,即可直接注入PrismaService,无需再注册。
效果验证
修改完成后启动应用,日志中只会出现一次onModuleInit PrismaService,同时PrismaClient会保持单例,仅创建一个数据库连接。
内容的提问来源于stack exchange,提问作者marsquai
相关产品推荐
相关产品推荐

