Nest.js和Express、fastity的关系

2,376 阅读2分钟

前言

image.png 在Nest.js中,Nest.js提供了IOC、AOP等特性,而且还对WebSocket、GraphQL、ORM等技术有不小的支持。

当我们用Node去写后端服务时,会面临三种选择。

  1. 直接使用httphttps模块。
  2. 使用expresskoa等请求处理库。
  3. 使用Nest.js企业级框架。

当我们使用Java去写后端时,我们会使用http模块手动处理嘛?当然不是,我们首选的肯定是Spring这种一站式的企业级框架。

同样,Nest.js就是Node中的Spring。

Nest.js通过适配器切换请求库

但是,Nest.js并没有和Express强耦合,它有一层抽象层,通过适配器方法去让我们自由切换请求处理库。

Nest.js定义了HttpServer接口

image.png

然后封装了AbstractHttpAdapter的class

image.png 在Nest.js中,分别提供了Express和fastity的Adapter实现。

image.png

当然,Exprees的Adapter是Nest.js默认提供的,如果需要查看fastity的Adapter则需要下载对应的包

npm install fastify @nestjs/platform-fastify

下载之后则可以看到fastity的Adapter。 image.png

怎么修改成fastity请求库

这是Express请求库的main.ts文件内容

image.png

我们只需要修改成这样

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { FastifyAdapter,  NestFastifyApplication} from '@nestjs/platform-fastify';

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

这样就可以切换成fastify请求库了。

思考

为什么Nest.js要这样做呢?

为什么可以使我们轻松的切换http处理库呢?

因为 Nest 的核心还是在于 IOC、AOP 这些架构特性,像 express、fastify 只不过是请求、响应的方法不同而已,区别并不大。

万一Nest.js与Express或fastity其中之一的http处理库强耦合,万一有更好的http处理库供我们选择呢?

这种加一层抽象和适配器的方式,能让 Nest.js 更加通用、灵活,有更强的扩展性。