菜单

平台适配器

相关源文件

平台适配器是 NestJS 架构的重要组成部分,它在应用程序和底层 HTTP 服务器实现之间提供了一个抽象层。这使得 NestJS 应用程序能够在不更改应用程序代码的情况下运行在不同的 HTTP 框架(如 Express 和 Fastify)上,从而有效地将业务逻辑与特定的平台细节解耦。

平台适配器简介

NestJS 被设计成平台无关的,这意味着它可以与不同的 HTTP 框架甚至非 HTTP 传输层一起工作。平台适配器通过在 NestJS 的内部接口和底层平台的特定 API 之间进行转换来实现这一点。

来源:packages/core/adapters/http-adapter.tspackages/core/adapters/http-adapter.ts packages/core/nest-application.ts73-81

默认情况下,NestJS 使用 Express 作为其 HTTP 平台。但是,它也提供了 Fastify 适配器,该适配器可以为特定用例提供性能优势。如果需要,您还可以为其他 HTTP 框架创建自定义适配器。

平台适配器架构

平台适配器模式的核心是 AbstractHttpAdapter 类,它定义了一个所有 HTTP 适配器都必须实现的通用接口。这使得 NestJS 能够一致地与任何 HTTP 框架进行交互。

来源:packages/core/adapters/http-adapter.ts8-175 packages/common/interfaces/http/http-server.interface.ts17-102 packages/platform-express/adapters/express-adapter.ts51-481 packages/platform-fastify/adapters/fastify-adapter.ts121-795

平台适配器架构由以下部分组成:

  1. HttpServer 接口:定义了 NestJS 中所有 HTTP 服务器实现的契约。
  2. AbstractHttpAdapter:提供具有通用功能的 HttpServer 接口的部分实现。
  3. 具体适配器:Express 和 Fastify 适配器,它们继承自 AbstractHttpAdapter 并提供特定于平台的实现。

内置平台适配器

NestJS 包含两个内置平台适配器:ExpressAdapter 和 FastifyAdapter。

Express 适配器

Express 是 NestJS 应用程序的默认 HTTP 平台。ExpressAdapter 封装了一个 Express 实例,并将其 API 适配为 NestJS 的要求。

Express 适配器的主要特点

  • 成熟的中间件生态系统
  • 成熟且广泛使用
  • 与大量现有的 Express 中间件兼容
  • 对于来自 Express 的开发者来说,熟悉的 API

来源:packages/platform-express/adapters/express-adapter.ts51-481 packages/platform-express/interfaces/nest-express-application.interface.ts20-143

Fastify 适配器

Fastify 是一个专注于性能的替代 HTTP 框架。FastifyAdapter 封装了一个 Fastify 实例,并将其 API 适配为与 NestJS 一起工作。

Fastify 适配器的主要特点

  • 更好的性能(在某些基准测试中比 Express 快 2 倍)
  • 更低的内存占用
  • 通过 JSON Schema 内置模式验证
  • 更现代的 API 设计

来源:packages/platform-fastify/adapters/fastify-adapter.ts121-795 packages/platform-fastify/interfaces/nest-fastify-application.interface.ts27-128

适配器实现细节

下图展示了平台适配器如何在 NestJS 应用程序中处理请求的详细视图

来源:packages/core/nest-application.ts107-127 packages/core/adapters/http-adapter.ts12-175

适配器方法和职责

平台适配器有几个关键职责:

  1. HTTP 服务器初始化:设置底层 HTTP 服务器。
  2. 请求处理:标准化 HTTP 方法(GET、POST 等)。
  3. 响应格式化:将控制器响应转换为合适的 HTTP 响应。
  4. 中间件支持:与特定框架的中间件集成。
  5. 服务器配置:管理服务器设置和选项。

下表显示了平台适配器实现的一些关键方法

方法描述
reply(response, body, statusCode?)向客户端发送响应
status(response, statusCode)为响应设置 HTTP 状态码
redirect(response, statusCode, url)执行 HTTP 重定向
render(response, view, options)渲染模板视图
setHeader(response, name, value)在响应上设置 HTTP 标头
getRequestMethod(request)从请求中提取 HTTP 方法
getRequestUrl(request)从请求中提取 URL
enableCors(options)为应用程序启用 CORS
registerParserMiddleware()为应用程序设置请求体解析器
createMiddlewareFactory()创建与平台兼容的中间件
close()关闭 HTTP 服务器

来源:packages/common/interfaces/http/http-server.interface.ts17-102 packages/core/adapters/http-adapter.ts19-169

平台特定功能

每个适配器都通过专门的接口提供对特定平台功能的访问

NestExpressApplication

来源:packages/platform-express/interfaces/nest-express-application.interface.ts20-143

NestFastifyApplication

来源:packages/platform-fastify/interfaces/nest-fastify-application.interface.ts27-128

平台适配器在 NestJS 应用程序生命周期中的集成

下图说明了平台适配器如何集成到 NestJS 应用程序生命周期中

来源:packages/core/nest-application.ts132-134 packages/core/nest-application.ts287-334

比较 Express 和 Fastify 适配器

功能Express 适配器Fastify 适配器
NestJS 中的默认值
性能良好更好(可能快 2 倍)
内存使用较高较低
中间件风格Connect 中间件Fastify 插件和钩子
静态文件服务express.static@fastify/static 插件
模板渲染Express 视图引擎@fastify/view 插件
请求体解析内置中间件内置解析器
请求验证外部包JSON Schema 内置
社区生态系统较大增长中

来源:packages/platform-express/adapters/express-adapter.ts51-481 packages/platform-fastify/adapters/fastify-adapter.ts121-795

创建自定义适配器

要为其他 HTTP 框架创建自定义适配器,您需要:

  1. 扩展 AbstractHttpAdapter
  2. 实现所有抽象方法
  3. 将您的框架的 API 映射到 NestJS 适配器接口

一个简单的例子可以在测试适配器实现中看到

来源:packages/core/test/utils/noop-adapter.spec.ts5-42

在应用程序中使用适配器

基本用法

使用特定平台的特性

来源: packages/platform-express/interfaces/nest-express-application.interface.ts83-130 packages/platform-fastify/interfaces/nest-fastify-application.interface.ts77-92

结论

平台适配器是 NestJS 的关键架构组件,它通过允许应用程序在不同的 HTTP 框架上运行而无需更改应用程序代码,从而提供了灵活性。适配器模式将框架特定的代码隔离起来,并向应用程序的其余部分呈现一个一致的接口。

Express 和 Fastify 是 NestJS 中两个官方支持的 HTTP 框架,它们各有优势。Express 是默认选择,拥有成熟的生态系统,而 Fastify 则提供了更好的性能特性。通过实现 AbstractHttpAdapter 抽象类,还可以为其他框架创建自定义适配器。