NestJS中如何在其他模块初始化前调用Proto微服务
解决方案
要让Proto文件的获取逻辑在所有模块初始化(包括它们的onModuleInit钩子)之前执行,你可以用NestJS内置的APP_INITIALIZER提供者,它专门负责在应用启动前运行初始化任务,优先级高于所有模块的生命周期钩子。
具体修改你的CallProtoModule如下:
import { Module, APP_INITIALIZER } from "@nestjs/common"; import { GrpcProtoModule } from "../grpcProto/grpcProto.module"; import { GrpcProtoService } from "../grpcProto/grpcProto.service"; // 定义Proto文件初始化逻辑 async function fetchProtoFiles(grpcProtoService: GrpcProtoService) { const markupTrainGrpcProto = { packageName: 'markupTrainGrpc', }; const gensecgrpcProto = { packageName: 'gensecgrpc', }; await grpcProtoService.getProto(gensecgrpcProto); await grpcProtoService.getProto(markupTrainGrpcProto); } @Module({ imports: [GrpcProtoModule], providers: [ { provide: APP_INITIALIZER, useFactory: fetchProtoFiles, inject: [GrpcProtoService], multi: true, // 允许同时注册多个初始化器,不覆盖其他逻辑 }, ], }) export class CallProtoModule {}
原理说明
APP_INITIALIZER会在NestJS应用启动的最早期阶段执行,早于所有模块的onModuleInit钩子触发。- 通过
inject注入GrpcProtoService,确保初始化函数能调用服务方法获取Proto文件。 multi: true选项可以保留其他可能存在的初始化逻辑,避免冲突。
这样修改后,其他模块在执行onModuleInit配置gRPC客户端时,所需的Proto文件已经被提前获取完成,就能解决之前的时序问题。
内容的提问来源于stack exchange,提问作者fa sa
相关产品推荐
相关产品推荐

