簡體   English   中英

Nest.js async onModuleInit 無效排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM