Skip to main content

性能(Fastify)

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

note

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

Fastify 提供了 Nest 的良好替代框架, 因为它以与 Express 类似的方式解决设计问题。 然而,fastify 比 Express 快得多,实现了几乎两倍更好的基准结果。 一个合理的问题是为什么 Nest 使用 Express 作为默认的 HTTP 提供程序? 原因是 Express 被广泛使用,众所周知,并且有一个庞大的兼容中间件集,这些中间件可以立即供 Nest 用户使用。

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

安装

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

npm i --save @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(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 的工作方式 - 请在此页面上查看更多信息,

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 的路由配置功能以及 @RouteConfig() 装饰器。

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

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

示例

这里有一个可运行的示例。