我有一个应用程序和一个库,两个独立的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。
我认为除了在环境中存储域之外,还需要使用其他东西。
一些选项:
- 使用相对URL例如:
this.http.get('/someUrl')
在这种情况下,请求是针对当前域的 - 使用本地使用的代理。文档
- 在环境中使用静态URL
- 使用
location.prepareExternalUrl
文档 - 可能是一个组合