Nest.js 重要的生命周期事情:
-
onModuleInit:
当模块被初始化后触发。这个事情在模块的 providers 被创立之后,但在它们被运用之前触发。 -
onModuleDestroy:
当模块被毁掉前触发。这通常发生在使用程序封闭时,能够用来做一些清理工作,比方封闭数据库衔接。 -
onApplicationBootstrap:
当使用程序完全启动并且所有的模块都已初始化后触发。这是在整个使用程序加载完成后执行一些初始化逻辑的好时机。 -
beforeApplicationShutdown:
这是 onApplicationShutdown 之前触发的事情,能够用来处理一些预清理工作。 -
onApplicationShutdown:
当使用程序预备封闭时触发。你能够在这个事情中执行一些清理逻辑,比方优雅地封闭服务器。 -
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 实例,然后调用它的办法(比方封闭衔接等)。