You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJs中PrismaService的onModuleInit多次调用问题解决

解决Nest.js中PrismaService的onModuleInit被多次调用的问题

问题原因

你在AppModule和CsvParsersModule的providers数组中都注册了PrismaService,而Nest.js默认会为每个模块中注册的Provider创建独立实例,这就导致PrismaService被实例化两次,onModuleInit方法自然会执行两次,同时还会创建多余的数据库连接,浪费资源。

解决方案

方法一:将PrismaService封装为全局模块

这是最规范且常用的方式,适合全局复用的服务:

  1. 完善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 {}
    
  2. 修改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 {}
    
  3. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:18:20