将环境变量从json传递到库

时间:2019-04-24 13:55:14

标签: json angular typescript environment-variables

我有一个config.json文件,其中包含我的angular 7应用程序的环境变量,然后将其加载到环境const中,并且工作正常。 一旦我尝试使用InjectionTokens将此环境变量传递给我的新库,就会开始发生奇怪的行为。 我不仅想知道如何解决它,还想知道怎么办。

我已经尝试了多种方法来导入json文件,包括使用XMLHttpRequest。 在将对象设置为环境之前,还尝试过深度复制对象。

我的config.json文件:

{
  "baseHref": "app",
  "apiEndpoint": "http://localhost:8080/api"
}

我的environment.prod.ts文件:

import config from '../config.json';

export const environment = {
  production: true,
  baseHref: config.baseHref,
  apiEndpoint: config.apiEndpoint,
  testing: 'Testing'
};
console.log(environment);

我的app.module.ts文件:

imports: [
  TestingModule.forRoot({
    baseHref: environment.baseHref,
    apiEndpoint: environment.apiEndpoint,
    testing: environment.testing,
    production: environment.production
  }),
]

我的app.module.ts文件:

export class TestingModule {

  static forRoot(config: any): ModuleWithProviders {
    return {
      ngModule: TestingModule,
      providers: [
        {
          provide: TESTING_CONFIG,
          useValue: config,
        },
      ],
    };
  }

}

我的testing.service.ts构造函数:

  constructor(@Inject(TESTING_CONFIG) private config: any) {
    console.log(this.config);
  }

期望两个控制台日志中的所有变量都带有数据,但是,环境文件一个拥有所有数据,但是第二个控制台日志中将apiEndpoint显示为null,将测试显示为“ Testing”。

我还尝试调试该应用程序,并在forRoot之前已经将所有数据包含在环境属性中。

也注意到了,用以下命令运行它:

    "aot": true,
    "buildOptimizer": true

在没有这两个选项的情况下运行时确实存在此问题。

1 个答案:

答案 0 :(得分:0)

我找到的解决方案来自于: Angular call function inside forRoot method

我知道传递一个回调来解析环境中的环境变量:

export function getConfig() {
  return {
    baseHref: environment.baseHref,
    apiEndpoint: environment.apiEndpoint,
    testing: environment.testing,
    production: environment.production
  };
}

imports: [
  TestingModule.forRoot(getConfig),
]

然后在库中,我经过一个工厂,该工厂执行给出的任何回调。

export function initializeConfigs(configCallback: any) {
  return configCallback();
}

export class TestingModule {

  static forRoot(config: any): ModuleWithProviders {
    return {
      ngModule: TestingModule,
      providers: [
        {
          provide: 'CONFIG_CALLBACK',
          useValue: config,
        }, {
          provide: TESTING_CONFIG,
          useFactory: initializeConfigs,
          deps: [ 'CONFIG_CALLBACK' ]
        }
      ],
    };
  }

}

这将使TESTING_CONFIG注入令牌正确包含所有数据,而无需更改环境文件。