一篇文章掌握 NestJS 所有的生命周期以及生命周期的执行时机

前言

NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架,它使用 TypeScript 作为开发语言,也支持原生的 JavaScript。在 NestJS 中,生命周期事件是一个重要的概念。在我们构建和管理应用程序时,有时需要在特定的阶段执行一些操作,例如在创建实例,添加或删除模块,突然终止程序时,对这些事件加以利用,可以使我们的应用程序更强大、灵活。

在本文中,我将介绍 NestJS 的生命周期,如何使用生命周期,并通过给出详细的例子加深理解。

NestJS 有哪些生命周期

NestJS 的生命周期钩子允许你在特定时刻执行特定代码,例如在模块初始化或关闭应用时。在 NestJS 中,每个模块和提供者(providers)都有自己的生命周期。

其中可能包括如下几种事件:

Untitled.png

应用启动阶段

  1. onModuleInit()

    当你的模块通过 modules 数组注册在 Nest 应用程序中时,内部所有的 providers(包括你的服务、守卫、拦截器等)初始化后会调用此方法。这是生命周期的第一个环节。

  2. onApplicationBootstrap()

    此阶段表示所有的东西(模块、providers 以及路由加载器等)都已经被完全初始化,Nest 应用实例已准备好处理请求了。因此,这是 bootstraping 过程的最后一个步骤,它也表示 HTTP 服务器已完成启动。

应用关闭阶段

  1. onModuleDestroy()

    当正在销毁 module 时(通常是你主动调用了 app.close(),或者 Nest 进程被 OS 发来的 SIGINT、SIGTERM 等信号中断时),这个方法会被调用。

  2. BeforeApplicationShutdown

    任何实现了 BeforeApplicationShutdown 的方法在应用关闭前都会被调用。如果是因为应用收到系统信号,并准备进行关闭处理时(例如 SIGTERM 或 SIGINT),对应的信号名称将传给 beforeApplicationShutdown(signal?: string) 这个方法。

  3. onApplicationShutdown()

    此阶段是关闭过程的最后一个步骤。它给 Nest 大环境一些时间做最后的清理行为(例如日志写入等)。当这个方法执行完后,进程就会正式退出。

📌 如果生命周期方法返回一个 Promise,Nest 将等待这个 Promise 完成(或者解决)之后再继续生命周期。

生命周期使用方式

OnModuleInit VS OnModuleDestroy

import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';@Injectable()
export class LoggingService implements OnModuleInit, OnModuleDestroy {onModuleInit() {console.log(`The LoggingService has been initialized.`);}onModuleDestroy() {console.log(`The LoggingService is being destroyed.`);}
}

当模块初始化时,我们在控制台打印出 The LoggingService has been initialized;当模块被销毁时,则打印 The LoggingService is being destroyed.

OnApplicationBootstrap VS BeforeApplicationShutdown

import { Injectable, BeforeApplicationShutdown, OnApplicationBootstrap } from '@nestjs/common';@Injectable()
export class LoggingService implements BeforeApplicationShutdown, OnApplicationBootstrap {onApplicationBootstrap() {console.log(`Application has fully started`);}beforeApplicationShutdown(signal: string) {console.log(`Received shutdown signal: ${signal}`);}
}

onApplicationShutdown

onApplicationShutdown 方法,它将在应用进行关闭之前被触发。

import { Injectable, OnApplicationShutdown } from '@nestjs/common';@Injectable()
export class AppService implements OnApplicationShutdown {onApplicationShutdown(signal: string) {console.log('AppService is shutting down due to: ', signal);}
}

其中,signal 参数可以获取导致应用关闭的信号类型,如 'SIGINT''SIGTERM' 或 **'SIGKILL'**等。

这种方式在你需要在应用关闭前进行一些清理工作,如关闭数据库连接、结束正在执行的任务或记录日志等方面特别有用。

总结

理解 NestJS 的生命周期事件以及如何处理这些事件,可以帮助我们在构建大型复杂应用程序时保持代码的清晰性和组织性,希望本文能够对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307457.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】C语言实现双链表的基本操作

双链表及其基本操作的实现 导言一、单链表与双链表二、双链表类型的创建三、双链表的初始化四、双链表的创建五、双链表的遍历六、双链表的查找七、双链表的插入八、双链表的删除结语 导言 大家好,很高兴又和大家见面啦!!! 经过…

全方面了解vcruntime140_1.dll的解决方法,多种vcruntime140_1.dll丢失的方法

在日常使用电脑时,我们常常遇到各种各样的问题。其中之一就是丢失vcruntime140_1.dll文件,这是一个重要的系统文件,会影响到电脑的正常运行。今天小编就来给大家详细的说说这一方面的咨询,教会大家多种的丢失vcruntime140_1.dll的…

文件销毁 硬盘销毁 数据销毁:护航数据安全的最后一公里

希望与业界各位志同道合的伙伴交流切磋最新的网络、服务器行业动态信息,同时分享腾讯在网络与服务器领域,规划、运营、研发、服务等层面的实战干货,期待与您的共同成长。 网络平台部以构建敏捷、弹性、低成本的业界领先海量互联网云计算服务…

PBR纹理贴图类型详解

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 PBR 纹理是一种帮助 3D 艺术家使他们的 3D 渲染看起来更逼真的技术。…

Live800:客服售前、售中,售后需要做哪些服务?有哪些区别?

客服在售前、售中和售后阶段扮演着重要的角色,他们为顾客提供全方位的服务,确保顾客的满意度和忠诚度。尽管这三个阶段都涉及到与顾客的互动,但每个阶段的服务内容和重点有所不同。 在售前阶段,客服的主要任务是提供产品或服务的信…

腾讯云服务器买1年送3个月,怎么送?免费吗?

腾讯云服务器买1年送3个月怎么送?在买赠活动页面 https://curl.qcloud.com/oRMoSucP 打开后,腾讯云百科以2核4G5M轻量应用服务器为例,点击立即购买,然后在“赠送福利”中选择“免费赠送时长”或“免费再领一台2核4G5M轻量”&#…

循环冗余效验码的计算方法

循环冗余效验码的计算方法 G(x): 在了解计算方法之前我们首先要明白G(x)表明的意思,这一步非常重要! 例如,G(x) x^3 x^2 1 ,该式子表明的编…

Oracle 19c OCP 1z0 082考场真题解析第17题

考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为云贝教育郭一军guoyJoe原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 17. Which three …

算法设计与分析实验报告-贪心算法

校课程的简单实验报告。 算法设计与分析实验报告-递归与分治策略 算法设计与分析实验报告-动态规划算法 算法设计与分析实验报告-贪心算法 dijkstra迪杰斯特拉算法(邻接表法) 算法设计与分析实验报告-回溯法 算法设计与分析实验报告-分支限界法 …

如何本地搭建FastDFS文件服务器并实现远程访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

10、RabbitMQ高频面试题

1、你们项目中哪里用到了RabbitMQ RabbitMQ是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 : 通过Feign实现服务的同步调用通过MQ实现服务的异步通信 下面要结合自己的项目中功能来说两个地方 xxx xxx 2、为什么会选择使用RabbitMQ 我们项…

【C++】引用详解

前言 在学习C语言时,我们通常会遇到两个数交换的问题,为了实现这一功能,我们会编写一个经典的Swap函数,如下所示: void Swap(int *a, int *b) {int tmp *a;*a *b;*b tmp; } 然而,这个Swap函数看起来可…