夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Node基础

  • 《MySQL》学习笔记

  • Midway

  • Nest

    • 开篇词
    • 学习理由
    • nest概念扫盲
    • 快速掌握 nestcli
    • 5种http数据传输方式
    • IoC 解决了什么痛点问题?
    • 如何调试 Nest 项目
    • Provider注入对象
    • 全局模块和生命周期
    • AOP 架构有什么好处?
    • 一网打尽 Nest 全部装饰器
    • Nest如何自定义装饰器
    • Metadata和Reflector
    • ExecutionContext切换上下文
    • Module和Provider的循环依赖处理
    • 如何创建动态模块
    • Nest和Express,fastify
    • Nest的Middleware
    • RxJS和Interceptor
    • 内置Pipe和自定义Pipe
    • ValidationPipe验证post请求参数
    • 如何自定义 Exception Filter
    • 图解串一串 Nest 核心概念
      • 定义 provider
      • 在 module 中引入
      • NestFactory.create 并执行生命周期
      • Nest 从接收到请求,到返回响应的这个流程及各个切面
        • 1.middleware
        • 2.Guard
        • 3.Interceptor
        • 4.Pipe
        • 5.Exception Filter
      • 总结
    • 接口如何实现多版本共存
    • Express如何使用multer实现文件上传
    • Nest使用multer实现文件上传
    • 图书管理系统
    • 大文件分片上传
    • 最完美的 OSS 上传方案
    • Nest里如何打印日志
    • 为什么Node里要用Winston打印日志
    • Nest 集成日志框架 Winston
    • 通过Desktop学Docker也太简单了
    • 你的第一个 Dockerfile
  • 其他

  • 服务端
  • Nest
神说要有光
2025-03-10
目录

图解串一串 Nest 核心概念

前面讲了 IOC、AOP、全局模块、动态模块、自定义 provider、生命周期等概念,比较零散,这节我们画图来整体串一串。

# 定义 provider

首先,provider 是可以注入的对象,它们都有 token,比如 @Injectable 装饰器声明的 class

token 可以是 class 也可以是 string:

provider 可以是 useClass 指定 class,也可以 useValue 指定值,或者 useFactory 动态创建。

provider 之间可以相互注入,还可以注入到 controller 里。

# 在 module 中引入

provider、controller 放在一个个 Module 里:

module 里 exports 的 provider 在模块被 imports 之后就可以用于别的模块的注入了。

或者可以通过 @Global 把这个模块声明为全局的,那样 Module 内的 provider 就可以在各处注入了。

Provider 可以通过 useFactory 动态创建,Module 也是,可以通过 register、forRoot、forFeature 等方法来动态创建。

# NestFactory.create 并执行生命周期

在 main.ts 里调用 NestFactory.create 方法,就会从 AppModule 开始递归解析 Module,实例化其中的 provider、controller,并依次调用它们的 onModuleInit 生命周期方法。

之后会再递归调用每个 Module 的 provider、controller 的还有 Module 自身的 onApplicationBootstrap 生命周期方法。

这样 Nest 就能对外提供服务了。

# Nest 从接收到请求,到返回响应的这个流程及各个切面

再就是 Nest 从接收到请求,到返回响应的这个流程,有很多切面。

路由最终是在 cotnroller 的方法,也就是 handler 里处理的。

在这个过程中,会经历很多层切面:

# 1.middleware

首先,请求会被 middleware 处理,这一层可以复用 express 的中间件生态,实现 session、static files 等功能。

这个 middleware 也可以是 Nest 的那种 class 的 middleware,可以注入 provider。

# 2.Guard

然后在具体的路由会经历 Guard 的处理,它可以通过 ExecutionContext 拿到目标 class、handler 的metadata 等信息,可以实现权限验证等功能。

# 3.Interceptor

之后是 Interceptor 可以在请求前后做一些处理,它也可以通过 ExecutionContext 拿到 class、handler 的信息。

# 4.Pipe

在到达 handler 之前,还会对参数用 Pipe 做下检验和转换。

# 5.Exception Filter

这个过程中不管是哪一层抛的异常,都会被 Exception Filter 处理下,返回给用户友好的响应信息。

这就是整个请求到响应的流程。

通过 AOP 的切面,可以把通用逻辑封装起来,在各处复用。

之后,Nest 销毁的时候,也会依次调用 Module 的 provider、controller 还有 Module 自己的 onModuleDestroy 方法、beforeApplicationShutdown 还有 onApplicationShutdown 的生命周期方法。

后两者的区别是 beforeApplication 可以拿到终止信号。

这就是 Nest 从创建、启动,到处理请求返回响应,再就是销毁的整个流程。

通过 IOC 实现了对象的自动创建、依赖的自动组装。

通过 AOP 实现了通用逻辑的抽取和复用。

IOC 内部的 Module 和 Provider 也都支持动态创建,灵活度很高。

# 总结

我们通过图解串了一下 Module、Provider、Controller、动态模块、全局模块、自定义 Provider、生命周期、Middleware、Guard、Pipe、Interceptor、Exception Filter 等概念。

对 IOC、AOP 也有了更加清晰的认识。

把这些核心概念理解了,对 Nest 就算有比较好的掌握了。

编辑 (opens new window)
上次更新: 2025/5/14 16:47:16
如何自定义 Exception Filter
接口如何实现多版本共存

← 如何自定义 Exception Filter 接口如何实现多版本共存→

最近更新
01
IoC 解决了什么痛点问题?
03-10
02
如何调试 Nest 项目
03-10
03
Provider注入对象
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式