【发布时间】:2017-09-10 05:56:58
【问题描述】:
我需要获取我的 Angular 2 应用程序的完整基本 URL(例如 http://localhost:5000 或 https://productionserver.com),以便我可以将其传递给应用程序上下文中的第 3 方服务。应用的位置取决于它是开发、各种暂存/测试环境还是生产环境,我想动态检测它,因此我不需要维护硬编码列表。
过去曾提出过similar question,但答案(即使用某些版本的window.location.hostname 或window.location.origin 属性)仅在浏览器呈现angular2 应用程序时有效。
我希望我的应用与 Angular Universal 一起使用,这意味着它需要在无法访问 DOM 对象(如 window.location)的服务器端呈现。
任何想法如何做到这一点?作为参考,使用asp.net core作为后端(使用默认的dotnet new angular模板)。
【问题讨论】:
-
Universal 中有 ORIGIN_URL 提供程序,github.com/angular/universal/blob/2.x/modules/platform-node/…。我建议检查它是否有效。无论如何,一个好习惯是提供包含主机名的环境变量/提供程序。 API 调用的主机可能不同,您迟早会做同样的事情。
-
尝试像
@Inject(ORIGIN_URL) @Optional() origin一样注入它,并在服务器端调试它的含义。 -
感谢您的提示!我对 Angular 有点陌生,所以如果这很明显,请原谅我,但你知道我如何检查 ORIGIN_URL 是否会给我想要的东西吗?我尝试向它询问我的组件的构造函数,如下所示:constructor(@Inject(ORIGIN_URL) private _origin) 但我收到错误“无法解析 HomeComponent 的所有参数”。我尝试将它添加到我的 ngModule 装饰器的 Providers 数组中,但这似乎也没有改变错误。也许有一些我不知道的语法细节?
-
它应该被标记为可选,因为它在客户端不存在。
-
谢谢!看起来它在服务器端具有价值。我只是通过将它渲染到包装在 {{}} 中的模板来解决这个问题,而客户端没有触及它。奇怪的是,尽管我的构造函数看起来像构造函数(@Optional() @Inject(ORIGIN_URL) origin),但客户端一直在抱怨同样的错误(“无法解析所有参数”)。