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 了。
切换后需要注意什么?
虽然大多数情况下业务代码不用改,但还是有一些细节需要注意:
- 中间件的兼容性:Express 的中间件不能直接在 Fastify 上运行。如果你用了大量的 Express 中间件(比如
cors、helmet),需要找 Fastify 的替代品,或者使用@fastify/express来兼容(但不推荐,会损失性能)。 - 响应对象:在 Fastify 下,响应对象的方法略有不同。例如,Fastify 推荐使用
reply.send()而不是res.send()。如果你在代码里直接用了@Res()注入响应对象并调用 Express 特有的方法,就可能出问题。不过一般来说,我们很少直接操作响应对象,都是通过返回值让 Nest 处理,所以影响不大。 - 性能提升:Fastify 确实比 Express 快,但具体提升多少取决于你的应用场景。如果你对性能有极致要求,可以考虑切换。
- 测试:有些测试工具可能依赖 Express,切换后需要调整。
适配器模式的好处
通过适配器模式,Nest 实现了解耦。你可以把底层 HTTP 库当作一个可插拔的组件,随时替换,而不需要改动核心业务逻辑。这种设计也体现了“面向接口编程”的思想。
文件里也提到了:“这就是适配器模式的魅力”。Nest 内部的实现是基于接口的,它定义了 HTTP 服务器需要实现的功能,然后 ExpressAdapter 和 FastifyAdapter 分别实现了这些接口。这样,Nest 核心就不知道底层是什么,只知道调用接口方法。
什么时候需要切换到 Fastify?
- 当你需要更高的吞吐量、更低的延迟时,比如在微服务场景或 API 网关中。
- 当你熟悉 Fastify 的插件生态,或者想避免 Express 的一些历史包袱时。
- 当你希望尝试新事物,或者在做性能对比测试时。
但如果你的项目已经用了很多 Express 专属的中间件,切换成本可能会比较高,需要权衡。
总结
Nest 通过适配器模式,让我们可以轻松切换底层 HTTP 库,无论是 Express 还是 Fastify,都能无缝接入。这种设计不仅提升了框架的灵活性,也让我们可以根据项目需求自由选择最合适的工具。下次当你听到“Nest 基于 Express”时,别忘了它其实也可以基于 Fastify,只要换个适配器就行。

Comments | NOTHING