NestJS创建动态模块时无法通过useFactory注入ConfigModule的问题
问题解析与修复方案
核心问题
- 直接调用
useFactory()未传入依赖:你在CoreModule.registerAsync里直接执行options.useFactory(),但没有传入ConfigService实例,导致config参数为undefined,触发Cannot read properties of undefined (reading 'get')错误。 - 参数名拼写错误:
app.module.ts里的injects是错误写法,NestJS标准字段名为inject。 - 同步执行无法获取异步依赖:当前写法试图同步解析配置,但
ConfigService是异步注入的,必须通过Nest的异步模块机制处理。
修复后的代码
app.module.ts
修正参数名拼写:
@Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, validate, }), CoreModule.registerAsync({ useFactory: (config: ConfigService) => ({ cacheEnabled: config.get('cache').enabled, }), imports: [ConfigModule], inject: [ConfigService], // 修正为标准字段名inject }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
core.module.ts
重构registerAsync方法,通过Nest异步提供者机制解析配置后动态导入模块:
@Module({}) export class CoreModule { static registerAsync(options: { useFactory: (...args: any[]) => Promise<{ cacheEnabled: boolean }> | { cacheEnabled: boolean }; imports?: any[]; inject?: any[]; }): DynamicModule { // 创建异步提供者解析配置 const configProvider = { provide: 'CORE_MODULE_CONFIG', useFactory: options.useFactory, inject: options.inject || [], }; // 用moduleFactory异步获取配置,动态决定导入模块 return { module: CoreModule, imports: options.imports || [], providers: [configProvider], moduleFactory: async (moduleRef: ModuleRef) => { const config = await moduleRef.get('CORE_MODULE_CONFIG'); const imports = []; if (config.cacheEnabled) { imports.push(HttpCacheModule); } return { module: CoreModule, imports, }; }, }; } }
补充说明
moduleFactory允许在模块初始化阶段异步获取解析后的配置,从而动态决定要导入的模块。CORE_MODULE_CONFIG是自定义提供者令牌,用于存储解析后的配置,确保能正确获取cacheEnabled的值。
内容的提问来源于stack exchange,提问作者Killua
相关产品推荐
相关产品推荐

