Как ввести объект с сервера? - PullRequest
0 голосов
/ 13 апреля 2020

Я использую Angular Universal для обслуживания моего приложения Angular с сервера Express.

Моя цель - внедрить объект среды ( с сервера ) в мое приложение. Таким образом, я создал InjectionToken

export const ENVIRONMENT = new InjectionToken('ENVIRONMENT');

и предоставил его на стороне сервера следующим образом:

app.engine(
  'html',
  ngExpressEngine({
    bootstrap: AppProdServerModule,
    providers: [{ provide: ENVIRONMENTS, useValue: environments }],
  })
);

Такой доступ к объекту среды работает отлично, когда приложение работает на сервере. Но когда приложение запускается на клиенте, я получаю NullInjectionError.

constructor(@Inject(ENVIRONMENTS) private env) { }

Так каков наилучший способ внедрить объект с сервера во все приложение (также клиента )

1 Ответ

1 голос
/ 13 апреля 2020

Ваше клиентское приложение не может знать во время выполнения, какой должна быть ценность этого провайдера.

Трудно сказать, не видя всего варианта использования, но, работая на клиенте, вы можете установите значение этого провайдера в запросе HTTP. Как то так:

export class SetEnvServcie () {
  constructor(
    private httpClient: HttpClient,
    private injector: Injector
  ) { }

  setEnv(){
    this.httpClient.get('URL_OF_ENV_CONFIG').pipe(
      take(1),
      tap(config => Injector.create({
        providers: [
          { provide: ENVIRONMENT, useValue: config }
        ]
      }, parent: this.injector)
      )
    )
  }
}
...