Nest.js 重要的生命周期事情:

  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 完成它:

Nest:使用生命周期事情详解(七)

同理 controller、service 也这样完成。
最后输出的结果是:
Nest:使用生命周期事情详解(七)

使用毁掉的时分也相同有生命周期:

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

beforeApplicationShutdown 里能够拿到 signal 系统信号的,比方 SIGTERM。
这些终止信号是别的进程传过来的,让它做一些毁掉的事情,比方用 k8s 办理容器的时分,能够通过这个信号来通知它。

Nest:使用生命周期事情详解(七)

顺次也在 controller、service 这样完成。
3s 后调用 app.close() 触发毁掉。(只是触发毁掉逻辑,但不会真正退出进程)
Nest:使用生命周期事情详解(七)

生命周期办法执行顺序:
Nest:使用生命周期事情详解(七)

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

咱们能够在 onApplicationShutdown 的生命周期里:
拿到当前模块的引证,调用 get 办法,传入 token,取出对应的 provider 实例,然后调用它的办法(比方封闭衔接等)。

Nest:使用生命周期事情详解(七)