平台适配器是 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
平台适配器架构由以下部分组成:
NestJS 包含两个内置平台适配器:ExpressAdapter 和 FastifyAdapter。
Express 是 NestJS 应用程序的默认 HTTP 平台。ExpressAdapter 封装了一个 Express 实例,并将其 API 适配为 NestJS 的要求。
Express 适配器的主要特点
来源:packages/platform-express/adapters/express-adapter.ts51-481 packages/platform-express/interfaces/nest-express-application.interface.ts20-143
Fastify 是一个专注于性能的替代 HTTP 框架。FastifyAdapter 封装了一个 Fastify 实例,并将其 API 适配为与 NestJS 一起工作。
Fastify 适配器的主要特点
来源: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
平台适配器有几个关键职责:
下表显示了平台适配器实现的一些关键方法
| 方法 | 描述 |
|---|---|
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
每个适配器都通过专门的接口提供对特定平台功能的访问
来源:packages/platform-express/interfaces/nest-express-application.interface.ts20-143
来源:packages/platform-fastify/interfaces/nest-fastify-application.interface.ts27-128
下图说明了平台适配器如何集成到 NestJS 应用程序生命周期中
来源:packages/core/nest-application.ts132-134 packages/core/nest-application.ts287-334
| 功能 | 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 框架创建自定义适配器,您需要:
AbstractHttpAdapter 类一个简单的例子可以在测试适配器实现中看到
来源: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 抽象类,还可以为其他框架创建自定义适配器。