使用 RxJS timeout 操作符给 Angular SSR 服务器端渲染模式下的 HTTP 请求添加超时机制

简介: Angular Universal 是一个开源项目,扩展了 @angular/platform-server 的功能。 该项目使 Angular 中的服务器端渲染成为可能。

Angular Universal 是一个开源项目,扩展了 @angular/platform-server 的功能。 该项目使 Angular 中的服务器端渲染成为可能。


为了在服务器上渲染,Angular 使用 node.js 的 DOM 实现——domino. 对于每个 GET 请求,domino 都会创建一个类似的 Browser Document 对象。 在该对象上下文中,Angular 初始化应用程序,然后向后端发出请求,执行各种异步任务,并将任何来自组件的更改检测应用到 DOM,同时仍在 node.js 环境中运行。渲染引擎随后将 DOM 序列化为字符串并将字符串提供给服务器。服务器将此 HTML 作为对 GET 请求的响应发送。 服务器上的 Angular 应用程序在渲染后被销毁。


使用 Angular Universal 进行服务器端渲染,最常见的一个问题就是,用户在网站上打开一个页面并看到一个白屏。翻译成 Web 应用领域的术语来说,就是首字节时间(Time to First Byte, 简称 TTFB) 过大。TTFB 是指从浏览器请求页面,到它从服务器接收到第一个信息字节之间的时间。在这种情况下,浏览器确实想从服务器接收响应,但请求以超时结束。


在分析这个性能问题之前,我们有必要了解 Zone.js 和 ApplicationRef.


Zone.js 是一个允许开发人员跟踪异步操作的工具。在它的帮助下,Angular 创建了自己的 Zone 并在其中启动应用程序。在 Angular 区域中的每个异步操作结束时,都会触发更改检测。


ApplicationRef 是对正在运行的应用程序(文档)的引用。在这个类的所有功能中,我们对 ApplicationRef.isStable 属性感兴趣。它是一个发出布尔值的 Observable。当 Angular 区域中没有异步任务正在运行时,isStable 为 true,当有任何异步任务时,isStable 为 false.


因此,应用程序的稳定性,取决于 Angular 区域中异步任务的存在与否。


当应用程序的 ApplicationRef.isStable 第一次变为 true 时, Angular 会渲染当前状态的应用程序,并清理平台资源。


我们现在可以假设用户正在尝试打开一个无法达到稳定状态的应用程序。 setInterval、rxjs.interval 或在 Angular 区域中运行的任何其他递归的异步操作,以及 HTTP 请求,都会阻止 Angular 应用进入稳定状态。


我们可以使用 rxjs 的 timeout 操作符,强制使得一个长时间运行的 HTTP 请求超时。

import { timeout, catchError } from 'rxjs/operators';
import { of } from 'rxjs/observable/of';
http.get('<https://example.com>')
  .pipe(
    timeout(2000),
    catchError(e => of(null))
  ).subscribe()

上面例子的逻辑是,如果 HTTP 请求两秒内,没有从服务器端接收到响应,则进入 catchError 错误处理模块内部。

这个解决方案的缺点是,对于每个 HTTP 请求,我们都需要手动为其添加 timeout 操作符。

一种更加优雅的实现是,使用开发包 @ngx-ssr/timeout 里的 NgxSsrTimeoutModule.

如果模块被导入 AppServerModule,那么 HTTP 请求超时将只对服务器端渲染环境起作用。

import { NgModule } from '@angular/core';
import {
  ServerModule,
} from '@angular/platform-server';
import { AppModule } from './app.module';
import { AppComponent } from './app.component';
import { NgxSsrTimeoutModule } from '@ngx-ssr/timeout';
@NgModule({
  imports: [
    AppModule,
    ServerModule,
    NgxSsrTimeoutModule.forRoot({ timeout: 500 }),
  ],
  bootstrap: [AppComponent],
})
export class AppServerModule {}


目录
相关文章
|
1月前
|
Web App开发 监控 UED
如何解决Angular中的Error: HTTP request failed, call timeout问题
在Angular应用中,遇到HTTP请求超时错误`Error: HTTP request failed, call timeout`时,可通过多种途径解决。首先,可增加请求超时时间,Angular默认无超时限制,设置合理的超时时间如5秒有助于避免长时间等待无响应。其次,检查服务器响应时间,利用开发者工具监控网络请求,优化服务器端代码或调整超时值。最后,确认网络连接稳定性,使用`navigator.onLine`检测网络状态,并在不同网络环境中测试。这些策略共同作用,能够有效提升应用的稳定性和用户体验。
67 1
|
20天前
|
前端开发 安全 开发者
JSF文件上传,让Web应用如虎添翼!一招实现文件上传,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,文件上传是重要功能之一。JSF(JavaServer Faces)框架提供了强大的文件上传支持,简化了开发流程。本文将介绍JSF文件上传的基本步骤:创建前端表单、处理上传文件的后端Action类、将文件保存到服务器指定目录以及返回结果页面。通过示例代码,我们将展示如何利用JSF实现文件上传功能,包括使用`h:inputFile`控件和`ManagedBean`处理上传逻辑。此外,JSF文件上传还具备类型安全、解耦合和灵活性等优点,有助于提升程序的健壮性和可维护性。
24 0
|
20天前
|
UED
JSF文件下载:解锁终极文件传输秘籍,让你的Web应用瞬间高大上!
【8月更文挑战第31天】掌握JSF文件下载功能对构建全面的Web应用至关重要。本文通过具体代码示例,详细介绍如何在JSF中实现文件下载。关键在于后端Bean中的文件读取与响应设置。示例展示了从创建实体类到使用`&lt;h:commandLink&gt;`触发下载的全过程,并通过正确设置响应头和处理文件流,确保文件能被顺利下载。这将显著提升Web应用的实用性与用户体验。
35 0
|
20天前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
31 0
|
20天前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
24 0
|
20天前
|
开发者 Windows Android开发
跨平台开发新选择:揭秘Uno Platform与.NET MAUI优劣对比,帮你找到最适合的框架,告别选择困难症!
【8月更文挑战第31天】本文对比了备受关注的跨平台开发框架Uno Platform与.NET MAUI的特点、优势及适用场景。Uno Platform基于WebAssembly和WebGL技术,支持Windows、iOS、Android及Web平台,而.NET MAUI由微软推出,旨在统一多种UI框架,支持Windows、iOS和Android。两者均采用C#和XAML进行开发,但在性能、平台支持及社区生态方面存在差异。Uno Platform在Web应用方面表现出色,但性能略逊于原生应用;.NET MAUI则接近原生性能,但不支持Web平台。开发者应根据具体需求选择合适的框架。
36 0
|
28天前
|
JavaScript 前端开发 Java
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
|
2月前
|
安全 Java 网络安全
RestTemplate进行https请求时适配信任证书
RestTemplate进行https请求时适配信任证书
47 3
|
1月前
|
存储 安全 搜索推荐
HTTP的Cookie机制
【8月更文挑战第19天】Cookie 是服务器为识别用户身份而发送给浏览器的小型文本文件。首次访问时,服务器通过响应中的 Set-Cookie 创建并发送 Cookie 给浏览器。
|
2月前
|
消息中间件 API 数据库
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。