性能表现 Performance (Fastify)

导读

默认情况下,Nest 使用 Express 框架。如前所述,Nest 还提供与其他库的兼容性,例如 Fastify。Nest 通过实现框架适配器来实现这种框架独立性,该适配器的主要功能是将中间件和处理程序代理到适当的特定于库的实现。

提示

请注意,为了实现框架适配器,目标库必须提供与 Express 中类似的请求/响应管道处理。

Fastify 为 Nest 提供了一个很好的替代框架,因为它以类似于 Express 的方式解决了设计问题。但是,fastify 比 Express 得多,基准测试结果几乎好两倍。一个合理的问题是,为什么 Nest 使用 Express 作为默认的 HTTP 提供程序?原因是 Express 被广泛使用、众所周知,并且拥有大量兼容的中间件,可供 Nest 用户开箱即用。

但由于 Nest 提供框架独立性,因此您可以轻松地在它们之间迁移。当您高度重视非常快速的性能时,Fastify 可能是一个更好的选择。要使用 Fastify,只需选择本章中所示的内置FastifyAdapter即可。

安装

首先,我们需要安装所需的包:

bash
$ npm i --save @nestjs/platform-fastify

Adapter

一旦安装了 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(3000)
}
bootstrap()

默认情况下,Fastify 仅监听 localhost 127.0.0.1 接口(阅读更多https://www.fastify.io/docs/latest/Guides/Getting-Started/#your-first-server))。如果要接受其他主机上的连接,则应在 listen() 调用中指定 '0.0.0.0'

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 进行正确的重定向,请返回状态代码和 URL,如下所示:

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

Fastify 选项

您可以通过 FastifyAdapter 构造函数将选项传递给 Fastify 构造函数。例如:

ts
new FastifyAdapter({ logger: true })

中间件

中间件函数检索原始 reqres 对象,而不是 Fastify 的包装器。这就是 middie 包的工作原理(在后台使用)和 fastify - 请查看此页面https://www.fastify.io/docs/latest/Reference/Middleware/)了解更多信息,

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

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

@Injectable()
export class LoggerMiddleware {
  use(req, res, next) {
    console.log('Request...');
    next();
  }
}

路由配置

您可以使用 @RouteConfig() 装饰器来使用 Fastify 的 路由配置 功能。

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

路由约束

从 v10.3.0 开始,@nestjs/platform-fastify 使用 @RouteConstraints 装饰器支持 Fastify 的 路由约束 功能。

ts
@RouteConstraints({ version: '1.2.x' })
newFeature() {
  return 'This works only for version >= 1.2.x';
}
提示

@RouteConfig()@RouteConstraints@nestjs/platform-fastify 导入。

示例

此处 提供了一个有效示例。