我目前正在阅读使用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只被调用一次。这应该如何解决?
2条答案
按热度按时间dwbf0jvd1#
你注册了两次这个服务,这就是为什么你得到了同一个类的两个示例。
您只需在其中一些模块中添加一次,然后将其导出到另一个模块。
9lowa7mx2#
问题是您在AppModule和CsvParsersModule处导入了Prisma服务两次。当在其他模块中将Prisma服务声明为提供者时,Nest为每个提供者创建一个新示例。
我猜它最好有一个专门的模块为棱镜,在那里你必须导出棱镜服务。然后你只需要导入模块Prisma在你需要使用Prisma服务的模块中只有一个Prisma示例。
在其他模块中导入模块时,可以使用导入模块中的导出示例。你可以在new模块中使用导出的服务而不包含在提供程序中。这样,您只有一个服务示例。如果在提供程序中包含,则会创建一个新示例。
您可以使用全局模块来实现此目的。为了避免频繁地导入模块