跳到主要内容

生命周期

Nest 在启动时,会递归解析 Module 的依赖,扫描其中的 provider 和 controller,注入依赖到 module。所有 module 解析完后开始监听端口,处理请求。

Nestjs 从启动到程序停止是有一些列生命周期钩子可以使用的,所有钩子都支持异步的,但钩子执行是串行的,所以一个异步钩子任务执行太久会阻塞后续钩子的执行,同时也会阻塞项目的运行

Lifecycle Events

  • onModuleInit 模块初始化完成后, 依次递归调用模块的 controllers 和 providers 中依赖的 onModuleInit 方法
  • onApplicationBootstrap 模块初始化完成,在监听端口前递归调用模块的 controllers 和 providers 中依赖的 onApplicationBootstrap 方法
  • onModuleDestroy 收到终止信号后调用,递归调用模块依赖 Module 的 onModuleDestroy 方法
  • beforeApplicationShutdown 在所有模块 onModuleDestroy 执行之后递归模块调用,表示在连接即将关闭时的事件,和 onModuleDestroy 的区别在于它能接收到信号
  • onApplicationShutdown 在连接关闭后,依次递归调用模块的 controllers 和 providers 中依赖的 onApplicationShutdown 方法

启动项目到监听端口​

这个过程涉及到两个 hook 「 onModuleInit 和 onApplicationBootstrap 」。

举个 🌰,现在我创建了三个 Module,分别在每个模块的 Controller、Service 和 Module 使用了这两个生命周期函数

Module Init

看下调用顺序

Init Module Lifecycle

可以看到调用顺序,方式是深度优先遍历

停止程序​

调用 app.close() 会触发,生命周期调用顺序都是深度优先遍历,就不多赘述了