Nest 与 Express/Fastify:通过适配器模式切换底层 HTTP 库


Nest 与 Express/Fastify:通过适配器模式切换底层 HTTP 库

NestJS 的底层设计中的一个巧妙之处——适配器模式。Nest 默认是基于 Express 运行的,但你有没有想过,它其实可以轻松切换到另一个高性能的 HTTP 库 Fastify?而且切换过程几乎不需要改动业务代码,这就是适配器模式的魅力。


为什么 Nest 要支持切换底层库?

首先得明白,Nest 不是一个简单的 HTTP 框架,它是一个完整的、企业级的 Node.js 开发框架。它提供了模块化、依赖注入、AOP 等架构特性,而底层的 HTTP 请求处理其实可以交给不同的库去实现。Express 是目前最流行的 Node.js Web 框架,生态丰富、中间件多,但它的性能并不是最优的。Fastify 则主打高性能,号称比 Express 快很多,而且也有不错的生态。

Nest 的设计目标之一就是让开发者既能享受架构带来的便利,又能灵活选择底层的 HTTP 引擎。所以它抽象出了一层接口,让 Express 和 Fastify 都能“插”上去。


适配器模式在 Nest 中的体现

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将某个类的接口转换成客户端期望的另一个接口。在 Nest 里,这个模式体现在 @nestjs/platform-express@nestjs/platform-fastify 这两个包上。

  • @nestjs/platform-express:这是默认的适配器,它内部使用 Express 处理 HTTP 请求。当你用 nest new 创建项目时,默认就会安装这个包。
  • @nestjs/platform-fastify:这是 Fastify 的适配器,如果你希望用 Fastify 替代 Express,只需要安装这个包,然后修改几行代码即可。

这两个包都实现了相同的接口,所以对 Nest 核心来说,它只管调用适配器的方法,而不管底层是 Express 还是 Fastify。这样,你的控制器、服务、模块等业务代码完全不受影响。


如何切换到 Fastify?

切换过程其实非常简单,主要分两步:

第一步:安装 Fastify 适配器

npm install @nestjs/platform-fastify fastify

第二步:修改 main.ts

原来的 main.ts 里用的是 NestFactory.create(AppModule),它会默认使用 Express。要切换成 Fastify,需要换成 NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter())

import { NestFactory } from '@nestjs/core';
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter(),
  );
  await app.listen(3000);
}
bootstrap();

搞定!就这么简单。现在你的 Nest 应用底层就是 Fastify 了。


切换后需要注意什么?

虽然大多数情况下业务代码不用改,但还是有一些细节需要注意:

  1. 中间件的兼容性:Express 的中间件不能直接在 Fastify 上运行。如果你用了大量的 Express 中间件(比如 corshelmet),需要找 Fastify 的替代品,或者使用 @fastify/express 来兼容(但不推荐,会损失性能)。
  2. 响应对象:在 Fastify 下,响应对象的方法略有不同。例如,Fastify 推荐使用 reply.send() 而不是 res.send()。如果你在代码里直接用了 @Res() 注入响应对象并调用 Express 特有的方法,就可能出问题。不过一般来说,我们很少直接操作响应对象,都是通过返回值让 Nest 处理,所以影响不大。
  3. 性能提升:Fastify 确实比 Express 快,但具体提升多少取决于你的应用场景。如果你对性能有极致要求,可以考虑切换。
  4. 测试:有些测试工具可能依赖 Express,切换后需要调整。

适配器模式的好处

通过适配器模式,Nest 实现了解耦。你可以把底层 HTTP 库当作一个可插拔的组件,随时替换,而不需要改动核心业务逻辑。这种设计也体现了“面向接口编程”的思想。

文件里也提到了:“这就是适配器模式的魅力”。Nest 内部的实现是基于接口的,它定义了 HTTP 服务器需要实现的功能,然后 ExpressAdapter 和 FastifyAdapter 分别实现了这些接口。这样,Nest 核心就不知道底层是什么,只知道调用接口方法。


什么时候需要切换到 Fastify?

  • 当你需要更高的吞吐量、更低的延迟时,比如在微服务场景或 API 网关中。
  • 当你熟悉 Fastify 的插件生态,或者想避免 Express 的一些历史包袱时。
  • 当你希望尝试新事物,或者在做性能对比测试时。

但如果你的项目已经用了很多 Express 专属的中间件,切换成本可能会比较高,需要权衡。


总结

Nest 通过适配器模式,让我们可以轻松切换底层 HTTP 库,无论是 Express 还是 Fastify,都能无缝接入。这种设计不仅提升了框架的灵活性,也让我们可以根据项目需求自由选择最合适的工具。下次当你听到“Nest 基于 Express”时,别忘了它其实也可以基于 Fastify,只要换个适配器就行。

声明:麋鹿与鲸鱼|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Nest 与 Express/Fastify:通过适配器模式切换底层 HTTP 库


Carpe Diem and Do what I like