Techniques

性能(Fastify)

学习如何在 NestJS 中使用 Fastify 适配器来提升应用程序性能,包括安装、配置和使用方法。

性能(Fastify)

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

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

Fastify 为 Nest 提供了一个很好的替代框架,因为它以与 Express 类似的方式解决设计问题。然而,fastify 比 Express 更快,实现了几乎两倍的基准测试结果。一个公平的问题是为什么 Nest 使用 Express 作为默认的 HTTP 提供者?原因是 Express 被广泛使用,众所周知,并且拥有大量兼容的中间件,这些中间件可以开箱即用地提供给 Nest 用户。

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

安装

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

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

适配器

安装 Fastify 平台后,我们可以使用 FastifyAdapter

@@filename(main)
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);
}
bootstrap();

默认情况下,Fastify 仅监听 localhost 127.0.0.1 接口(阅读更多)。如果您想接受其他主机上的连接,您应该在 listen() 调用中指定 '0.0.0.0'

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,如下所示:

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

Fastify 选项

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

new FastifyAdapter({ logger: true });

中间件

中间件函数检索原始的 reqres 对象,而不是 Fastify 的包装器。这就是 middie 包的工作方式(在底层使用)和 fastify - 查看此页面了解更多信息,

@@filename(logger.middleware)
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();
  }
}
@@switch
import { Injectable } from '@nestjs/common';

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

路由配置

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

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

路由约束

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

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

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

示例

一个工作示例可在这里获得。