NestJS Logo
NestJS 中文文档
v10.0.0
  • 介绍
  • 快速上手
  • 控制器
  • 提供者
  • 模块
  • 中间件
  • 异常过滤器
  • 管道
  • 守卫
  • 拦截器
  • 自定义装饰器
  • 自定义提供者
  • 异步提供者
  • 动态模块
  • 依赖注入作用域
  • 循环依赖
  • 模块引用
  • 懒加载模块
  • 执行上下文
  • 生命周期事件
  • 发现服务
  • 跨平台无关性
  • 测试
迁移指南
API 参考
官方课程
  1. 文档
  2. 功能扩展
  3. 性能优化(Fastify)

MVC 模式
服务端推送事件

性能优化(使用 Fastify)

默认情况下,Nest 使用 Express 作为底层 HTTP 服务器框架。然而,正如前文所述,Nest 同样支持集成其他库,如 Fastify。这得益于 Nest 的框架无关性设计 —— 通过「框架适配器(framework adapter)」机制,Nest 能将中间件与请求处理流程委托给具体框架,从而实现底层替换的灵活性。

提示

请注意:要实现自定义框架适配器,目标框架必须具备类似 Express 的请求/响应管道处理能力。

Fastify 是一个在性能上优于 Express 的高效替代方案。它的设计理念与 Express 相近,能胜任相同的任务,但在速度和吞吐量上表现更为出色。根据基准测试结果,Fastify 的性能通常是 Express 的两倍左右。

既然如此,为什么 Nest 默认仍选择 Express?主要原因在于其庞大的用户群体、高知名度,以及丰富的中间件生态 —— 这些资源大多可以直接无缝集成进 Nest 项目中。

不过,由于 Nest 本身不依赖特定框架,你可以根据项目需求自由切换底层实现。如果你对性能要求较高,Fastify 是一个值得考虑的选择。启用方式也非常简单:只需在应用启动时使用内置的 FastifyAdapter 即可。

安装依赖

在开始使用 Fastify 之前,先安装相关平台支持包:

npm install @nestjs/platform-fastify

使用适配器

安装 Fastify 平台支持包后,即可通过内置的 FastifyAdapter 启动应用:

main.ts
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(process.env.PORT ?? 3000)
}

需要注意的是,Fastify 默认仅监听本地地址 127.0.0.1(详见官方文档说明)。如果希望让应用可被局域网或公网访问,你需要在 listen() 方法中显式传入 '0.0.0.0':

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

平台差异

使用 FastifyAdapter 后,Nest 会将 Fastify 作为底层 HTTP 服务器。这意味着,所有依赖 Express 实现的功能(如部分中间件、请求对象结构等),在 Fastify 环境下可能无法直接使用或表现不同。

为了获得良好的兼容性与体验,建议优先选择基于 Fastify 构建的中间件或工具,避免直接引入只适用于 Express 的模块。

重定向响应

Fastify 对重定向的处理方式与 Express 略有不同。在 Fastify 中,你需要显式设置状态码并调用 redirect() 方法,同时指定目标地址。例如:

@Get()
index(@Res() res) {
  res.status(302).redirect('/login')
}

请注意,使用 @Res() 装饰器会绕过 Nest 的响应映射机制,因此建议仅在需要精细控制底层响应行为(如重定向、设置 Cookie 等)时使用。

配置 Fastify 实例

你可以通过 FastifyAdapter 的构造函数,将配置对象传递给底层 Fastify 实例。例如,启用日志功能的写法如下:

new FastifyAdapter({ logger: true })

支持的所有配置项请参见 Fastify 官方文档。

中间件支持

在基于 Fastify 的 Nest 应用中,中间件函数接收到的是底层原始的 req 和 res 对象,而不是 Fastify 封装后的类型。这是因为 Nest 通过集成 Fastify 官方中间件插件 @fastify/middie,提供了中间件支持能力。

一个使用 Fastify 原始请求对象的中间件示例:

logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common'
import { FastifyRequest, FastifyReply } from 'fastify'

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: FastifyRequest['raw'], res: FastifyReply['raw'], next: () => void) {
    console.log('Request...')
    next()
  }
}

路由配置

Fastify 支持为每个路由定义独立的配置项,Nest 通过 @RouteConfig() 装饰器提供了这一功能的集成。你可以在控制器方法上定义个性化的路由行为:

import { RouteConfig } from '@nestjs/platform-fastify'

@RouteConfig({ output: 'hello world' })
@Get()
index(@Req() req) {
  return req.routeConfig.output
}

有关路由配置项的更多信息,可参考 Fastify 路由配置文档。

路由约束

从 @nestjs/platform-fastify v10.3.0 起,Nest 已支持 Fastify 的路由约束(route constraints) 功能。你可以使用 @RouteConstraints() 装饰器为路由定义版本控制、主机名限制等条件:

import { RouteConstraints } from '@nestjs/platform-fastify'

@RouteConstraints({ version: '1.2.x' })
@Get()
newFeature() {
  return '此功能仅适用于版本 >= 1.2.x'
}

示例项目

你可以在官方示例仓库中查看完整的 Fastify 集成示例代码:👉 GitHub 示例:nestjs/nest - sample/10-fastify