如何从服务器注入对象?

How to Inject an Object From the Server?

我正在使用 Angular Universal 从 Express 服务器为我的 Angular 应用程序提供服务。

我的目标是将环境对象(来自服务器)注入我的应用程序。因此我创建了一个 InjectionToken

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

并像这样在服务器端提供它:

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

当应用程序在服务器上 运行 时,像这样访问环境对象工作得很好。但是当应用程序在客户端上运行时,我得到一个 NullInjectionError.

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

那么将对象从服务器注入到整个应用程序(也包括客户端)的最佳方法是什么

您的客户端应用程序无法在 运行 时间内知道此提供程序的值应该是多少。

如果没有看到整个用例,很难说清楚,但是,当 运行在客户端上时,您可以在 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)
      )
    )
  }
}