[英]Nest.js async onModuleInit invalid ordering
我有ServiceA
依賴於RedisService
。
要初始化ServiceA
,需要RedisService
已經初始化(即RedisService.onModuleInit
已被調用並等待)
這是 ServiceA 定義:
// module config
@Module({
imports: [RedisModule],
controllers: [ServiceAController],
providers: [ServiceAService, RedisService],
})
export class ServiceAModule {}
class ServiceA {
constructor(
private readonly redisService: RedisService,
) {}
async onModuleInit(): Promise<void> {
this.logger.debug('Initializing ServiceA...')
const client = await this.redisService.getClient()
// do some stuff with client...
this.logger.debug('Initialized ServiceA')
}
}
這是 Redis 服務:
class RedisService {
constructor(private readonly configService: ConfigService) {}
async onModuleInit(): Promise<void> {
...
this.logger.log(`Initializing Redis client at ${host}:${port}`)
this.redis = new Cluster([{ port: port, host: host }], clusterConfig)
}
}
如您所見,RedisService 也在其 onModuleInit 生命周期方法內部進行了初始化。
我在日志中看到的內容:
[Nest] 41 - 01/08/2023, 10:30:19 AM DEBUG [ServiceA] Initializing ServiceA...
[Nest] 41 - 01/08/2023, 10:30:19 AM LOG [RedisService] Initializing Redis client at redis1:7000
// and here I get an error thrown from ServiceA.onModuleInit saying that Redis hasn't been initialized
Nest.js 之前甚至說“ServiceAModule 依賴項已初始化”,但尚未調用 Redis(這是一個依賴項)的 onModuleInit。 為什么?
如何保證onModuleInit的執行順序?
根據嵌套文檔:
onModuleInit():一旦宿主模塊的依賴關系被解析后調用。
這並不意味着依賴項已經初始化。
此時你不能確定onModuleInit
服務的onModuleInit
在 ServiceA 的 onModuleInit 之前運行。
另一方面,最好在您的 Redis controller 中進行new Cluster
初始化,以避免您的服務沒有定義屬性的情況
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.