【问题标题】:How to Inject an Object From the Server?如何从服务器注入对象?
【发布时间】:2020-04-13 07:28:51
【问题描述】:

我正在使用 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) { }

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

【问题讨论】:

    标签: angular typescript express angular-universal


    【解决方案1】:

    您的客户端应用程序无法在运行时知道此提供程序的价值。

    如果不查看整个用例就很难判断,但是,在客户端上运行时,您可以在 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)
          )
        )
      }
    }
    

    【讨论】:

    • 听起来不错。网址只是对快递服务器的请求?
    • 你觉得使用TransferState怎么样?也许这样更好,因为不需要额外的 http 请求?
    • @FlorianLudewig 当然!我以为您出于某种原因没有在服务器上呈现应用程序。如果这样做,请使用TransferState。 URL 应该是可以返回 env 配置的那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多