Передача переменных среды из json в библиотеки - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть файл 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);
  }

Ожидается, что все переменные с данными будут храниться в обоих журналах консоли, но вместо этого в файле среды 1 содержатся все данные, но во втором журнале консоли будет указано значение apiEndpoint как null, а тестирование - как «Тестирование».

Я также попытался отладить приложение и прямо перед тем, как в forRoot уже есть все данные о свойстве среды.

Также заметил, запустив это с:

    "aot": true,
    "buildOptimizer": true

Имеет эту проблему при работе без этих двух опций фактически полностью работает.

1 Ответ

0 голосов
/ 26 апреля 2019

Решение, которое я нашел, было получено из: Функция углового вызова внутри метода forRoot

Я знаю передать обратный вызов, который разрешает переменные окружения из окружения:

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 содержать все данные правильно, без изменений в файлах среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...