一篇文章掌握 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.mzph.cn/news/584226.shtml

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

相关文章

Prometheus快速入门实战

Prometheus快速入门实战 1. 介绍 prometheus受启发于Google的Brogmon监控系统(相似kubernetes是从Brog系统演变而来)。 2016年5月继kubernetes之后成为第二个加入CNCF基金会的项目,同年6月正式发布1.0版本。2017年底发布基于全新存储层的2.…

istio 应用灰度发布部署注意点(包括 deploy、svc、gw、vs 和 dr)

创建 deployment 分别部署两个版本的 deployment。在灰度发布的过程中,注意 pod 标签的设置,后续 svc 和 dr 就是根据标签来划分 pod apiVersion: apps/v1 kind: Deployment metadata:labels:app: bbjcxtversion: v1name: bbjcxtnamespace: mm-nbxt-hu…

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

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

NSNotificationCenter通知

使用观察者模式来实现的用于跨层传递消息的机制 参考文章 ios消息机制(NSNotification 和 NSNotificationCenter) 透彻理解 NSNotificationCenter 通知(含实现代码) - 掘金 NSNotificationCenter property (class, readonly, strong) NSNotification…

【.NET Core】匿名方法与扩展方法

【.NET Core】匿名方法与扩展方法 文章目录 【.NET Core】匿名方法与扩展方法一、匿名方法1.1 匿名方法定义1.2 通过Delegate关键字创建委托匿名方法1.3 通过Action关键字创建无返回值的匿名方法1.4 通过Func关键字创建有返回值的匿名方法1.5 使用Lambda表达式表示匿名方法 二、…

反射讲解(有图有真相)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、反射是什么?二、反射有啥好处?1. 没反射2. 有反射 三、反射的常用方法1. 获取 Class 对象:2. 获取类的构造方法&#xf…

python统计学-两个总体均值差的区间估计

简介 两个总体均值差的区间估计是指,在给定的置信水平下,估计两个总体均值差的置信区间。两个总体均值差的区间估计的公式为: X ‾ 1 − X ‾ 2 t α / 2 , n 1 n 2 − 2 s 1 2 n 1 s 2 2 n 2 \overline{X}_1 - \overline{X}_2 \pm t_{\a…

数组的声明

概要&#xff1a; 数组的声明分为三个部分 第一部分&#xff1a;数组中元素的数据类型 第二部分&#xff1a;数组名 第三部分&#xff1a;数组标识符(方括号)和数组大小 一、测试代码 #include<stdio.h> int main() {int arr_int[10];char* arr_str[10];arr_in…

软件测试/测试开发丨Selenium环境安装配置

一、selenium 环境配置 1、下载浏览器 目前比较常用的浏览器是 Google Chrome 浏览器&#xff0c;所以本教程以 chrome 为主&#xff0c;后面简介一下其他浏览器的环境配置。 chrome 下载: www.google.cn/chrome/ 2、chromedriver 环境配置 chromedriver 是chromedriver提…

R语言【base】——sprintf():接受格式化文本和变量值来搭建字符型向量。

Package base version 4.2.0 Parameters sprintf(fmt, ...)gettextf(fmt, ..., domain NULL, trim TRUE) 参数【fmt】&#xff1a;格式字符串的字符向量&#xff0c;每个字符串最多 8192 个字节。 参数【...】&#xff1a;要传递给参数【fmt】的值。仅支持逻辑向量、整数向…

【C++】引用详解

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

CEC2017(Python):五种算法(SSA、RFO、OOA、PSO、GWO)求解CEC2017

一、5种算法简介 1、麻雀搜索算法SSA 2、红狐优化算法RFO 3、鱼鹰优化算法OOA 4、粒子群优化算法PSO 5、灰狼优化算法GWO 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem defin…

Kubernetes 学习总结(43)—— Kubernetes 从提交 deployment 到 pod 运行的全过程

当用户向 Kubernetes 提交了一个创建 deployment 的请求后&#xff0c;Kubernetes 从接收请求直至创建对应的 pod 运行这整个过程中都发生了什么呢&#xff1f; kubernetes 架构简述 在搞清楚从 deployment 提交到 pod 运行整个过程之前&#xff0c;我们有先来看看 Kubernete…

Ubuntu 20.04使用Livox Mid-360

参考文章&#xff1a; Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一&#xff1a;Livox mid 360驱动安装与测试 前言&#xff1a; Livox mid360需要使用Livox-SDK2&#xff0c;而非Livox-SDK&#xff0c;以及对应的livox_ros_driver2 。 1. 安装Livox-SDK2 参…

golang 中判断结构体中某一个属性是否存在(以区分零值)

原问题地址&#xff1a;validate-struct field if it exists 有定义结构 package mainimport ("fmt""encoding/json" )type User struct {Name string json:"name,omitempty"Username *string json:"username,omitempty"Email …

自然语言处理1——探索自然语言处理的基础 - Python入门篇

目录 写在开头1. 介绍自然语言处理的基本概念1.1 NLP的核心目标1.2 常见的NLP任务1.3 应用场景详细介绍1.3.1 医疗保健1.3.2 金融领域1.3.3 教育领域1.3.4 社交媒体分析2. Python中常用的自然语言处理库简介2.1 NLTK (Natural Language Toolkit)2.2 Spacy2.3 Transformers2.4 T…

RabbitMQ是做什么的

rabbitMQ是做异步通讯的。用于解决同步同讯的拓展性差&#xff0c;级联失败的问题。 异步调用方式其实就是基于消息通知的方式&#xff0c;一般包含三个角色:。 消息发送者:投递消息的人&#xff0c;就是原来的调用方 消息代理:管理、暂存、转发消息&#xff0c;你可以把它理…

软件测试/测试开发丨Python常用数据结构-列表list

列表的定义 列表是有序的可变元素的集合&#xff0c;使用中括号[ ]包围&#xff0c;元素之间用逗号分隔&#xff1b;列表是动态的&#xff0c;可以随时扩展和收缩&#xff1b;列表是异构的&#xff0c;可以同时存放不同类型的对象&#xff1b;列表允许出现重复的元素。 列表的…

六、从0开始卷出一个新项目瑞萨RZN2L之loader app分离工程优化

六、loader app分离工程 6.1 概述 6.2 官方资料与不足 6.3 loader app分离工程的优化 6.3.1 自动调节合并appsection 6.3.2 loader中使用外设 6.3.3 app使用sram mirror 6.3.4 sram atcm同时使用 六、从0开始卷出一个新项目之瑞萨RZN2L loader…

深入浅出理解转置卷积Conv2DTranspose

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 论文&#xff1a;A guide to convolution arithmetic for deep learning github源码&#xff1a;Convolution arithmetic bilibili视频&#xff1a;转置卷积&#xff08;transposed convolution&#xff09; 转置…