我阅读了一个旧线程,其中建议共享NX环境变量,如下所示:
import { environment } from '../environments/environment';
@Module({
providers: [
{
provider: 'someProviderName',
useValue: environment.someEnvironmentValue
}
],
MyService
})
class AppModule {
}然后,你访问他们就像:
@Injectable()
class MyService {
constructor(@Inject('someProviderName') someEnvironmentValue: someType) {
}
}理由是:
如果您只需要访问AppModule中的环境变量,那么这很好,但是如何与导入的库模块共享这些环境变量呢?特别是其源不在文件?的同一个项目中的库模块。
是否每个需要访问环境变量的库模块都需要是一个动态模块(以及它的所有父模块)才能以这种方式利用环境变量?因此,您是否需要将forRoot 调用链接到任何需要访问这些变量的模块?
例如:
AppModule: DynamicModule
|
CoreModule: DynamicModule
| |
SomeFeatureModule: DynamicModule SomeOtherFeatureModule: NestModuleAppModule (需要ENV使它成为一个带有ForRoot的DynamicModule )CoreModule (需要来自AppModule的env,这样它就变成了带有ForRoot的DynamicModuleSomeFeatureModule需要来自CoreModule的env,因此它变成了带有forRoot的DynamicModule )另外,如果所有需要环境值的模块都变成了DynamicModule ,那么对性能有什么影响呢?
示例:
@Module({})
export class MyLibModule {
static forRoot(providers: Provider[]): DynamicModule {
return {
module: MyLibModule ,
providers: [...providers],
};
}
}const ENV_VALUE_PROVIDERS: ValueProvider[] = [
{
provide: 'PRODUCTION',
useValue: environment.production,
},
];
@Module({
providers: ENV_VALUE_PROVIDERS,
imports: [MyLibModule.register(ENV_VALUE_PROVIDERS)],
})
export class AppModule {}为什么NestJS强制任何库模块动态访问这些类型的环境变量,在这种情况下,这些变量在编译时是可用的?
我想到的唯一其他解决方案是创建一个库模块,它由每个需要环境变量的模块导入。这个模块将在AppModule中使用要导出的环境变量使用forRoot进行初始化。这个解决方案的问题是许多库将直接依赖于这个模块。
发布于 2022-02-01 20:24:14
对于DynamicModule上的所有问题,我仍然没有答案,但就目前而言,我通过以下方式解除了自己的障碍:
使用ValueProvider注入变量,然后在模块中使用“工厂”选项对象传递模块所需的特定环境变量。
下面是一些基本的未测试代码,说明了这个概念:
app/环境/环境。
export class Environment {...}app/app.module.ts
import { environment } from 'environments/environment';
Module({
providers: [{ provide: Environment, useValue: environment }],
imports: [
MyModule.register({
provide: MyModuleOptions,
value: (environment: any) => environment.MyModuleOptions,
inject: [Environment],
})
],
})
export class AppModule {}lib/my-module.module.ts
@Module({
providers: [SomeProviderThatUsesMyModuleOptions],
exports: [SomeProviderThatUsesMyModuleOptions]
})
export class MyModule {
static register(
options: MyModuleOptions | Provider<MyModuleOptions>)
: DynamicModule {
...
return {
module: MyModule,
providers: [MyModuleOptions]
...
};
}
}这篇文章更详细地介绍了核心概念。
https://stackoverflow.com/questions/70908879
复制相似问题