window.location.origin在Angular模块中为null



我有一个应用程序和一个库,两个独立的repo。我的应用程序使用我的库,而我的库包含一个执行http请求的服务。

我的应用程序部署到多个环境中,我使用Angular的environment.ts文件来定义外部服务所在的位置。所有应用程序都通过网关提供服务,并在同一个窗口上运行。location.origina.

ivy被禁用,aot被启用。

我的库公开了如下forRoot:

declarations: [
ToggleDirective
],
providers: [
ToggleService,
ToggleServiceConfig
],
exports: [
ToggleDirective
]
})
export class ToggleModule {
static forRoot(config: ToggleServiceConfig): ModuleWithProviders<ToggleModule> {
return {
ngModule: ToggleModule,
providers: [
{provide: ToggleServiceConfig, useValue: config }
]
};
}
}

我的应用程序的环境.ts看起来像这样:

export const environment = {
...
togglesUrl: window.location.origin + '/release-toggling',
...
};

在我的应用程序的App.module中,我这样配置它:


...
const releaseToggleServiceConfig: ToggleServiceConfig = {
togglesUrl: environment.togglesUrl
};
...
@NgModule({
declarations: [AppComponent],
imports: [
CoreModule,
SharedModule,
...
ToggleModule.forRoot(releaseToggleServiceConfig)
],
...
})
export class AppModule {}

如果我硬编码window.location.origin(本地,到"localhost:4200"(,那么它工作正常。显然,这个窗口在现阶段还不存在。这可能与aot有关,但不幸的是,禁用aot不是一个选项。

正确传递window.location.origin的最佳模式/做法是什么。从技术上讲,在应用程序调用我的外部服务之前,它是不需要的。

我对你的解决方案或建议感兴趣。这可能是一个很容易解决的问题,许多人以前都面临过。

所有应用程序都通过网关提供服务,并位于同一窗口上。location.origina.

如果两个应用程序都生活在同一个网关上,并且域也相同,那么也许你可以跳过window.location.origin你的环境.ts:

export const environment = {
...
togglesUrl: '/release-toggling',
...
};

显然,问题是该值在编译时得到了解决。您可以尝试使用类似togglesUrl: () => window.location.origin的函数,然后从代码中调用它。

就我个人而言,我不认为你有任何理由需要使用这种方法。这不会给你带来任何好处。如果您使用类似my/request的东西直接调用服务,这将自动解析为当前域。

另一种选择是直接在服务中解析源,或者更好的方法是创建一个HttpInterceptor,它将在运行时修补请求URL。

附言:你提前知道URL,所以你可以很容易地在一开始就定义正确的URL,而不用玩Location。

我认为除了在环境中存储域之外,还需要使用其他东西。

一些选项:

  1. 使用相对URL例如:this.http.get('/someUrl')在这种情况下,请求是针对当前域的
  2. 使用本地使用的代理。文档
  3. 在环境中使用静态URL
  4. 使用location.prepareExternalUrl文档
  5. 可能是一个组合

最新更新