typescript PrismaService onModuleInit在NestJ中被多次调用

inn6fuwd  于 2023-05-19  发布在  TypeScript
关注(0)|答案(2)|浏览(245)

我目前正在阅读使用Prisma的Nest.js应用程序的文档。根据文档,我创建了以下服务。

import { INestApplication, OnModuleInit } from "@nestjs/common";
import { PrismaClient } from "@prisma/client";

export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    console.log('onModuleInit PrismaService')
    await this.$connect();
  }

  async enableShutdownHooks(app: INestApplication){
    this.$on('beforeExit', async () => {
      console.log('PrismaService enableShutdownHooks beforeExit')
      await app.close();
    });
  }
}

文档描述了以下各项的使用。

import { Module } from '@nestjs/common';
import { Prisma } from '@prisma/client';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CsvParsersModule } from './csv-parsers/csv-parsers.module';
import { PrismaModule } from './prisma/prisma.module';
import { PrismaService } from './prisma/prisma.service';

@Module({
  imports: [CsvParsersModule],
  controllers: [AppController],
  providers: [AppService, PrismaService]
})
export class AppModule {}

但是,当服务在其他地方注册时,此类代码将导致onModuleInit被重复调用。

import { Global, Module } from '@nestjs/common';
import { CsvParsersService } from './csv-parsers.service';
import { CsvParsersController } from './csv-parsers.controller';
import { PrismaService } from 'src/prisma/prisma.service';

@Module({
  controllers: [CsvParsersController],
  providers: [CsvParsersService, PrismaService],
  exports: [CsvParsersService]
})
export class CsvParsersModule {}
[Nest] 78737  - 2022/07/21 8:05:23     LOG [NestFactory] Starting Nest application...
[Nest] 78737  - 2022/07/21 8:05:23     LOG [InstanceLoader] AppModule dependencies initialized +25ms
[Nest] 78737  - 2022/07/21 8:05:23     LOG [InstanceLoader] CsvParsersModule dependencies initialized +0ms
[Nest] 78737  - 2022/07/21 8:05:23     LOG [RoutesResolver] AppController {/}: +8ms
[Nest] 78737  - 2022/07/21 8:05:23     LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 78737  - 2022/07/21 8:05:23     LOG [RoutesResolver] CsvParsersController {/csv-parsers}: +0ms
[Nest] 78737  - 2022/07/21 8:05:23     LOG [RouterExplorer] Mapped {/csv-parsers, POST} route +0ms
onModuleInit PrismaService
onModuleInit PrismaService
[Nest] 78737  - 2022/07/21 8:05:23     LOG [NestApplication] Nest application successfully started +51ms

我认为最好的方法是onModuleInit只被调用一次。这应该如何解决?

dwbf0jvd

dwbf0jvd1#

你注册了两次这个服务,这就是为什么你得到了同一个类的两个示例。
您只需在其中一些模块中添加一次,然后将其导出到另一个模块。

9lowa7mx

9lowa7mx2#

问题是您在AppModule和CsvParsersModule处导入了Prisma服务两次。当在其他模块中将Prisma服务声明为提供者时,Nest为每个提供者创建一个新示例。
我猜它最好有一个专门的模块为棱镜,在那里你必须导出棱镜服务。然后你只需要导入模块Prisma在你需要使用Prisma服务的模块中只有一个Prisma示例。
在其他模块中导入模块时,可以使用导入模块中的导出示例。你可以在new模块中使用导出的服务而不包含在提供程序中。这样,您只有一个服务示例。如果在提供程序中包含,则会创建一个新示例。
您可以使用全局模块来实现此目的。为了避免频繁地导入模块

相关问题