0

0

聊聊node框架 Nest.js怎么松耦合地整合 Express !

青灯夜游

青灯夜游

发布时间:2022-03-02 19:54:30

|

3013人浏览过

|

来源于掘金社区

转载

本篇文章带大家聊聊node框架 nest.js是如何松耦合地整合 express 的,希望对大家有所帮助!

聊聊node框架 Nest.js怎么松耦合地整合 Express !

Nodejs 提供了 http 模块用于监听端口、处理 http 请求,返回响应,这也是它主要做的事情。

但是 http 模块的 api 太过原始,直接基于它来处理请求响应比较麻烦,所以我们会用 express 等库封装一层。

这一层做的事情就是给 request 和 response 添加了很多处理请求响应的方法,满足各种场景的需求,并且对路由做了处理,而且,也提供了中间件的调用链便于复用一些代码,这种中间件的调用链叫做洋葱模型。

1.png

但这一层没有解决架构问题:当模块多了怎么办,怎么管理?如何划分 Model、View、Controller? 等等。

所以,用 Node.js 做后端服务时我们会再包一层,解决架构问题,这一层的框架有 eggjs(蚂蚁的)、midwayjs(淘宝的)、nestjs(国外的)。

nestjs 是其中最优秀的一个:

2.png

3.png

4.png

这一层的底层还是 express、koa 等,它只是在那些 http 框架的基础上额外解决了架构问题。

而且 nestjs 还有一点做的特别好,它不依赖任何一个 http 平台,可以灵活的切换。

那么 nestjs 是怎么做到底层平台的切换的呢?

想想 react 是怎么做到把 vdom 渲染到 canvas、dom、native 的?

定义一层统一的接口,各种平台的 render 逻辑实现这些接口。这种模式叫做适配器模式。

适配器模式是当用到第三方实现的某个功能时,不直接依赖,而是定义一层接口,让第三方去适配这层接口。这样任何一个适配了这层接口的方案都能集成,也能够灵活的切换方案。

Nest.js 对底层的 http 平台就是提供了一层接口(HttpServer),定义了一堆用到的方法:

5.png

因为 ts 的 interface 必须实现所有的方法才行,为了简化,又继承了一层抽象类 AbstractHttpAdapter,把需要实现的方法定义成 abstract 的。

6.png

然后 express 或者别的平台比如 fastify 只要继承这个适配器的类,实现其中的抽象方法,就能接入到 Nest.js 里:

比如 ExpressAdapter:

7.png

或者 FastifyAdapter:

8.png

ReRoom AI
ReRoom AI

专为室内设计打造的AI渲染工具,可以将模型图、平面图、草图、照片转换为高质量设计效果图。

下载

这些逻辑分别放在 platform-express 和 platform-fastify 包里:

9.png

Nest.js 第一行代码是调用 create:

10.png

create 里就会选择一种 httpAdapter 来创建服务:

11.png

默认是 express:

12.png

这样,之后调用的 request 和 response 的方法最终就都是 express 的了。

比如在 controller 里可以用 @Request 装饰器来注入 reqeust 对象,就可以调用 reqeust 的各种方法。

import { Controller, Get, Request } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(@@Request() request: Request): string {
    return 'This action returns all cats';
  }
}

如果你想调用一些接口之外的特定平台的方法的话,Nest.js 也支持,那就换用 @Req 来注入:

import { Controller, Get, Req } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(@@Req() request: Request): string {
    return 'This action returns all cats';
  }
}

这样注入的就是特定平台比如 express 的原生 request 对象,就可以直接用它的所有方法。

此外,如果真的要用 Express 平台的特定 api 的话,在 NestFactory.create 的时候可以指定对应的类型参数,这样就能做相应的类型提示和检查了:

13.png

但是这样就和特定平台耦合了,除非是确定不会切换平台,否则不建议这么做。

http 平台是这么做的,同理,websocket 平台也是这样的:

定义了一层统一的接口,通过适配器的方式分别接入 socketio 和 websocket,可以灵活的切换:

14.png

图解下 Nest.js 关于 http 、websocket 平台的处理:

15.png

总结

Node.js 提供了 http 模块用来监听端口、处理请求响应,但是它的 api 过于原始,所以我们会包一层,在 express 这一层提供更多好用的 request、response 的 api,但这层没解决架构问题,要引入 MVC、IOC 等架构,需要再包一层,用 Egg.js、Midway.js、Nest.js 这种更上层的后端框架,其中 Nest.js 是最优秀的。

Nest.js 在和底层 http 平台的整合上做了特殊的设计,利用适配器模式,提供一层接口,让底层平台去适配,这样就可以灵活的切换不同的 http 平台了。

但它也同样支持用特定平台的 api,比如 controller 里可以用 @Req 注入底层的 request 对象,创建容器的时候也可以传入对应平台的类型参数。

Nest.js 默认使用的是 Express,但说用了 Express 也不完全对,因为可以灵活的切换别的。这就是适配器模式的魅力。

更多node相关知识,请访问:nodejs 教程

相关专题

更多
node.js调试
node.js调试

node.js调试可以使用console.log()输出调试信息、断点调试和第三方调试工具。详细介绍:1、console.log()输出调试信息,通过在代码中插入console.log()语句,开发人员可以在控制台输出变量的值、函数的执行结果等信息,以便观察代码的执行流程和状态;2、断点调试,可以在代码中设置断点,以便在特定位置暂停代码的执行,观察变量的值和执行流程等。

347

2023.09.19

JavaScript 全栈开发基础(Node.js + 前端)
JavaScript 全栈开发基础(Node.js + 前端)

本专题系统介绍 JavaScript 在全栈开发中的核心知识结构,涵盖 Node.js 基础、Express/Koa 接口构建、前端交互设计、模块化与包管理、数据库连接、前后端数据通信与部署流程。通过完整项目示例,帮助学习者掌握从浏览器到服务器的一体化开发能力,实现真正意义上的全栈入门。

93

2025.11.26

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

214

2025.12.18

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1051

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

107

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

691

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

11

2026.01.19

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.8万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 19万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号