NestJS 无法解析工厂提供的类的依赖关系

时间:2021-03-16 14:22:15

标签: nestjs

让我向您介绍AlgoModule

const apiFactory = {
    provide: 'API',
    useFactory: (moduleRef: ModuleRef, config: ConfigService) => {
        const apiService: Type<IApi> = config.getApiService();
        return moduleRef.get(apiService)
    },
    inject: [ModuleRef, ConfigService]
}

@Module({
    imports: [ConfigModule],
    providers: [


        // Services
        ApiService,
        ApiTestService,
        TestService,

        // Factories
        apiFactory 
    ],
    exports: []
})
export class AlgoModule {}

此模块导入 ConfigModule 并有一个工厂,该工厂根据 IApi 下的环境参数创建 ApiService 实例,该实例是 ApiTestServiceConfigService ConfigModule 已加载。

工厂使用注入到其上的 ConfigServiceModuleRef 来创建 IApi 的实例。

这是 IApi 实现之一的示例 - ApiService

@Injectable()
export class ApiService implements IApi {
    constructor(private config: ConfigService) {
    }
}

现在,当我创建一个新服务并将其放入 AlgoModule 的提供中时,假设 TestService

@Injectable()
export class TestService {
    constructor(
        private config: ConfigService,
        @Inject('API') private api: IApi) {
    }
}

我在这里所做的是,将令牌“API”注入 IApi,这是我在 AlgoModule 中使用 apiFactory

设置的

启动时会出现以下错误:

Error: Nest can't resolve dependencies of the ApiService(?). Please make sure that the argument dependency at index [0] is available in the AlgoModule context.

我做错了什么?

我想知道,因为我在 AlgoModule 中导入了 ConfigModule,所以工厂应该自动拥有它的依赖项。

配置服务:

@Injectable()
export class ConfigService {

    serviceMapping = {
        prod: ApiService,
        test: ApiTestService
    };

    getEnv(): string | 'prod' | 'test' {
        return String(process.env.ENV);
    }

    getApiService(): Type<IApi> {
        const env = this.getEnv();
        return this.serviceMapping[env];
    }
}

1 个答案:

答案 0 :(得分:-1)

您是否在全局模块的某处使用标志 isGlobal 调用了 ConfigModule.forRoot?

如果不是,那么你必须这样做,因为 ConfigModule 不像你想象的那样工作。

ConfigModule.forRoot 或 forFeature 会公开模块的 ConfigService 令牌,但普通的 ConfigModule 不会,除非它是全局的。