性能(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
。
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 });
中间件
中间件函数检索原始的 req
和 res
对象,而不是 Fastify 的包装。
这是 middie
包的工作方式(在底层使用)以及 fastify
的工作方式 -
请在此页面上查看更多信息,
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;
}
@RouteConfig() 从 @nestjs/platform-fastify 导入。
示例
这里有一个可运行的示例。