从不使用 Angular 服务器端渲染的资产中获取文件

Posted

技术标签:

【中文标题】从不使用 Angular 服务器端渲染的资产中获取文件【英文标题】:Fetching File from Assets not Working with Angular Server Side Rendering 【发布时间】:2020-02-12 02:02:36 【问题描述】:

我在运行时使用以下代码从资产文件夹加载json 文件:

initializeApp = () =>
  new Promise(async resolve => 
    this.settings await this.http.get(`/assets/file.json`).toPromise();
    resolve();
  );

当使用ng serve 编译 Angular 应用程序时,此代码可以正常工作。不过我也想支持server side rendering。使用npm run build:s-s-r 构建服务器并随后使用npm run serve:s-s-r 运行它时,我在节点服务器上收到以下错误:

ERROR  Error: Uncaught (in promise): Error
    at resolvePromise (/project/services/frontend/dist/server.js:1003:31)
    at /project/services/frontend/dist/server.js:913:17
    at rejected (/project/services/frontend/dist/server/main.js:136313:93)
    at ZoneDelegate.invoke (/project/services/frontend/dist/server.js:542:26)
    at Object.onInvoke (/project/services/frontend/dist/server/main.js:118689:33)
    at ZoneDelegate.invoke (/project/services/frontend/dist/server.js:541:52)
    at Zone.run (/project/services/frontend/dist/server.js:301:43)
    at /project/services/frontend/dist/server.js:1061:34
    at ZoneDelegate.invokeTask (/project/services/frontend/dist/server.js:574:31)
    at Object.onInvokeTask (/project/services/frontend/dist/server/main.js:118670:33)

【问题讨论】:

【参考方案1】:

使用 Angular Universal 时,URL 必须是绝对的。因此,要么在您的配置中的某处拥有基本 URL,要么从底层网络服务器中检索它,如 documentation 中所示

【讨论】:

【参考方案2】:

在服务器端添加resolve或reject,因为您的promise没有被任何resolver或reject处理。

【讨论】:

我已经打电话给resolve()。我还尝试添加try catchreject,但没有帮助 抱歉,如果您误解了我的意思,但添加 resolvereject 并不能解决问题。但我感谢你的帮助:)

以上是关于从不使用 Angular 服务器端渲染的资产中获取文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular Universal 进行服务器端渲染的防御性编程思路

Angular5服务器端渲染,外部Api数据服务在s-s-r中不起作用

将 Cloudfront 设置为从不重新获取资产

使用Angular4(Angular Universal)的服务器端渲染[关闭]

React 服务端渲染与预渲染

在 plesk 中设置服务器端渲染的 Angular 应用程序