生命周期
Nest 在启动时,会递归解析 Module 的依赖,扫描其中的 provider 和 controller,注入依赖到 module。所有 module 解析完后开始监听端口,处理请求。
Nestjs 从启动到程序停止是有一些列生命周期钩子可以使用的,所有钩子都支持异步的,但钩子执行是串行的,所以一个异步钩子任务执行太久会阻塞后续钩子的执行,同时也会阻塞项目的运行

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 使用了这两 个生命周期函数


看下调用顺序

可以看到调用顺序,方式是深度优先遍历
停止程序
调用 app.close() 会触发,生命周期调用顺序都是深度优先遍历,就不多赘述了
