Nest:应用生命周期事件详解

Nest 生命周期事件:

  1. onModuleInit
    当模块被初始化后触发。这个事件在模块的 providers 被创建之后,但在它们被使用之前触发。
  2. onModuleDestroy
    当模块被销毁前触发。这通常发生在应用程序关闭时,可以用来做一些清理工作,比如关闭数据库连接。
  3. onApplicationBootstrap
    当应用程序完全启动并且所有的模块都已初始化后触发。这是在整个应用程序加载完成后执行一些初始化逻辑的好时机。
  4. beforeApplicationShutdown
    这是 onApplicationShutdown 之前触发的事件,可以用来处理一些预清理工作。
  5. onApplicationShutdown
    当应用程序准备关闭时触发。你可以在这个事件中执行一些清理逻辑,比如优雅地关闭服务器。
  6. onRequest (中间件):
    虽然不是生命周期事件,但中间件可以在每个请求的生命周期中执行。它们在路由处理程序之前执行,可以进行请求日志记录、认证等操作。

Nest 启动时,会递归解析 Module 依赖,扫描其中的 provider、controller,注入它的依赖。

全部解析完后,会监听网络端口,开始处理请求。

过程中 Nest 暴露了一些生命周期方法:

  • 首先,递归初始化模块,会依次调用模块内的 controller、provider 的 onModuleInit 方法,然后再调用 module 的 onModuleInit 方法。
  • 全部初始化完之后,再依次调用模块内的 controller、provider 的 onApplicationBootstrap 方法,然后调用 module 的 onApplicationBootstrap 方法
  • 然后监听网络端口。之后 Nest 应用就正常运行了。

这个过程中,onModuleInit、onApplicationBootstrap 都是我们可以实现的生命周期方法。

在 module 实现它:

同理 controller、service 也这样实现。

最后输出的结果是:

应用销毁的时候也同样有生命周期:

  • 先调用每个模块的 controller、provider 的 onModuleDestroy 方法,然后调用 Module 的 onModuleDestroy 方法。
  • 之后再调用每个模块的 controller、provider 的 beforeApplicationShutdown 方法,然后调用 Module 的 beforeApplicationShutdown 方法。
  • 然后停止监听网络端口。
  • 之后调用每个模块的 controller、provider 的 onApplicationShutdown 方法,然后调用 Module 的 onApplicationShutdown 方法。
  • 之后停止进程。

beforeApplicationShutdown 里可以拿到 signal 系统信号的,比如 SIGTERM。

这些终止信号是别的进程传过来的,让它做一些销毁的事情,比如用 k8s 管理容器的时候,可以通过这个信号来通知它。

依次也在 controller、service 这样实现。

3s 后调用 app.close() 触发销毁。(只是触发销毁逻辑,但不会真正退出进程)

生命周期方法执行顺序:

而且所有的生命周期函数都是支持 async 的。

我们可以在 onApplicationShutdown 的生命周期里:

拿到当前模块的引用,调用 get 方法,传入 token,取出对应的 provider 实例,然后调用它的方法(比如关闭连接等)。

相关推荐
子非鱼9213 分钟前
Vue框架快速上手
前端·javascript·vue.js
winfredzhang3 分钟前
从零构建:基于 Node.js 与 ECharts 的量化交易策略模拟系统
前端·node.js·echarts·股票·策略
We་ct6 分钟前
LeetCode 380. O(1) 时间插入、删除和获取随机元素 题解
前端·算法·leetcode·typescript
LawrenceLan27 分钟前
Flutter 零基础入门(二十三):Icon、Image 与资源管理
开发语言·前端·flutter·dart
津津有味道37 分钟前
WEB浏览器网页读写Desfire EV1 EV2 EV3卡,修改DES、3DES、AES密钥JS源码JavaScript
前端·javascript·nfc·desfire·ev2·ev3·ev1
敲敲了个代码1 小时前
前端指纹技术是如何实现的?(Canvas、Audio、硬件API 核心原理解密)
前端·javascript·学习·算法·面试·web
Amumu121381 小时前
Vue简介
前端·javascript·vue.js
放逐者-保持本心,方可放逐1 小时前
React核心组件 及 钩子函数应用
前端·javascript·react.js·非阻塞更新·延迟更新·同步更新
小宇的天下1 小时前
Calibre nmDRC-H 层级化 DRC
java·服务器·前端
怒放de生命20101 小时前
前端子包+docker流水线部署+nginx代理部署
前端·nginx·docker