Angular 5 Universal 在服务器端渲染期间等待 http 请求返回

Posted

技术标签:

【中文标题】Angular 5 Universal 在服务器端渲染期间等待 http 请求返回【英文标题】:Angular 5 Universal wait for http request to return during server-side render 【发布时间】:2018-06-14 18:21:09 【问题描述】:

我有一个使用 ngExpressEngine 提供的 Angular 5 应用程序(遵循 Angular Universal 入门项目)。我的应用程序有一个组件,它发出 HTTP 请求以获取要显示的一些数据。一切正常,但是当我使用 fetch 作为谷歌机器人时,它返回呈现的页面,但没有任何数据。是否让 ngExpressEngine 服务器在将页面呈现给用户之前等待 HTTP 请求?

【问题讨论】:

刚刚遇到这个A dockerized, headless Chrome rendering solution,正在寻找另一个问题的答案。它看起来有点复杂,但似乎针对您遇到的问题。 什么时候发出http请求? 我们可以看看你的服务器端代码吗? server side 是什么意思?它是 Angular 通用的。检查我的评论github.com/angular/universal-starter/issues/… 服务器端是指在快速服务器中渲染 【参考方案1】:

您可以在提供程序中使用APP_INITIALIZER 来延迟应用初始化,直到从您的客户端应用模块中获取您的 api,例如:

//app.module.ts
        providers: [provide: APP_INITIALIZER, deps: [HttpClient], multi: true,
    useFactory: (http: HttpClient: Promise) => new Promise<Your Data Interface>((resolve, reject) => http.get("").pipe(map(data => 
     //do something with data
resolve(data)
    ), catchError(error => of(error).pipe(map(() => //do something if error)))))]

【讨论】:

【参考方案2】:

我不了解 Angular 5,但是使用最新的 Angular 版本(我写这篇文章时是 7.2),我可以确认通过 Resolve 加载的所有数据都在服务器端正确呈现,而且通过ngOnInit钩子加载的所有数据,即使它是异步的。

这要归功于 Zone.js,事实上,它会跟踪所有异步操作并在异步任务队列为空时发出 onMicrotaskEmpty 事件,让 Angular 知道页面已准备好呈现。供参考:what is the use of Zone.js in Angular 2

【讨论】:

以上是关于Angular 5 Universal 在服务器端渲染期间等待 http 请求返回的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 5 (s-s-r with Universal) 中使用 Google Analytics 功能?

使用 Angular Universal 在服务器端运行时找不到模块环境

Angular 2 Universal - 使用手写笔和 pug 模板的服务器端渲染

在 VS Code 中调试 Angular Universal Starter App 的服务器端不起作用

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

Angular Universal 12(服务器端)在延迟加载时不加载模块