gpt4 book ai didi

NestJs 在多个模块中使用相同的服务实例

转载 作者:行者123 更新时间:2023-12-03 23:36:11 32 4
gpt4 key购买 nike

我有一个 NestJs 应用程序,它使用两种服务。连接到 Db 的 DbService 和做事相当慢并使用注入(inject)的 DbService 的 SlowService。

现在应用程序应在 api 基本路径之外提供健康路由,所以我需要一个不同的模块来为健康路由提供 Controller 。

我创建了一个基本模块。

import { Module } from '@nestjs/common'
import { SlowService } from './slow.service'
import { DbService } from './db.service'

@Module({
imports: [],
controllers: [],
providers: [DbService, SlowService],
exports: [DbService, SlowService]
})
export class BaseModule {
}

ApiModule 和 HealthModule 现在都导入了基本模块,以便能够使用服务。
  imports: [BaseModule],

只有一个小问题。两个模块似乎都构建了自己的服务实例,但我需要它是同一个实例。我假设这是因为构造函数中的 console.log 在启动应用程序时出现了两次。我错过了一个设置还是什么?

更新

这是我的引导方法,因此您可以看到我如何初始化模块。
async function bootstrap (): Promise<void> {
const server = express()
const api = await NestFactory.create(AppModule, server.application, { cors: true })
api.setGlobalPrefix('api/v1')
await api.init()
const options = new DocumentBuilder()
.setTitle('...')
.setLicense('MIT', 'https://opensource.org/licenses/MIT')
.build()
const document = SwaggerModule.createDocument(api, options)
server.use('/swaggerui', SwaggerUI.serve, SwaggerUI.setup(document))
server.use('/swagger', (req: express.Request, res: express.Response, next?: express.NextFunction) => res.send(document))
const health = await NestFactory.create(HealthModule, server.application, { cors: true })
health.setGlobalPrefix('health')
await health.init()
http.createServer(server).listen(Number.parseInt(process.env.PORT || '8080', 10))
}
const p = bootstrap()

最佳答案

也许您将服务定义为 2 个模块的提供者。你需要做的只是定义你的BaseModule作为 进口 在您需要它的模块中。

此示例演示服务 OtherServiceOtherModule这需要 DbService来自 BaseModule .如果你运行这个例子,你会看到它只实例化了 DbService一次。

import {Injectable, Module} from '@nestjs/common';
import {NestFactory} from '@nestjs/core';

@Injectable()
export class SlowService {
constructor() {
console.log(`Created SlowService`);
}
}

@Injectable()
export class DbService {
constructor() {
console.log(`Created DbService`);
}
}

@Module({
imports: [],
providers: [SlowService, DbService],
exports: [SlowService, DbService]
})
export class BaseModule {}

@Injectable()
export class OtherService {
constructor(private service: DbService) {
console.log(`Created OtherService with dependency DbService`);
}
}

@Module({
imports: [BaseModule],
providers: [OtherService],
})
export class OtherModule {}

@Module({
imports: [
BaseModule,
OtherModule
],
})
export class AppModule {}

NestFactory.createApplicationContext(AppModule).then((app) => console.log('🥑 context created'));

这个要点演示了提供程序的错误使用,导致实例化 DbService两次: https://gist.github.com/martijnvdbrug/12faf0fe0e1fc512c2a73fba9f31ca53

关于NestJs 在多个模块中使用相同的服务实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55826790/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com