一篇文章掌握 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 的生命周期事件以及如何处理这些事件,可以帮助我们在构建大型复杂应用程序时保持代码的清晰性和组织性,希望本文能够对大家有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JUC常用并发工具类

JUC常用并发工具类 1、什么是JUC? JUC 就是 java.util.concurrent 包,这个包俗称 JUC,里面都是解决并发问题的一些东西,该包的位置位于 java 下 面的 rt.jar 包下面。 2、4大常用并发工具类 2.1 CountDownLatch CountDownLatch&#x…

[Angular] 笔记 17:提交表单 - ngSubmit

Submitting Forms (ngSubmit) 表单的一般完整写法: 如果表单验证失败,必须 disable 提交按钮,阻止用户提交不合法的数据。 提交表单后,与表单对应的 json 数据 post 到后端: {"id":1,"name":…

Windows上安装NodeJs

Windows上安装NodeJs 一、操作环境 操作系统: Windows 10 专业版 SDK:NodeJs v16.19.1(安装鸿蒙IDE自动安装的NodeJs) 二、安装过程 2.1下载Node.js安装包 官网下载地址: 下载历史版本安装也可 2.2 双击下载好的安装文件 2.3 打开下载…

从SLSA看软件供应链面临哪些威胁及对应解决方案

引言:软件制品供应链等级SLSA(Supply-chain Levels for Software Artifacts)是由由谷歌发起,基于行业共识建立的一个逐步完善供应链安全的规范。本文基于Google SLSA框架来看软件供应链安全面临的安全风险。 1. 简介 2023 年 4 月…

Educational cf 160的B题

Problem - B - Codeforces 找到最小操作次数,使得子串对应位与原来字符串对应位不相同。 交换是没有代价的,但是删除有代价。 首先复制两个一模一样的串,我们把下面作为固定串,然后对串中0和1的个数进行计数,由于我…

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

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

(001)Unit 编译 UTF8JSON

文章目录 编译 Dll编译报错附录 编译 Dll 新建工程: 注意 UnityEngineDll 的选择!2022 版本的太高了!!! 下载包,导入unity : 3. 将 unf8json 的源码拷贝到新建的工程。 4. 编译发布版本: 编译…

做抖店的话营业执照要办什么类型?法人必须是本人信息?问题解答

我是王路飞。 想在抖音开店的新手,好像对抖音个人店有一种迷之追求。 先劝告你们一句,贪小便宜容易吃大亏。 抖音个人店并不适合新手开通,它重在“试运营”这三个字,新手不仅无法正常把店铺做起来,而且后续还要把对…

MPLS动态协议LDP配置示例

一、预习: MPLS是一种根据报文中携带的标签来转发数据的技术,两台LSR必须在它们之间转的数据 的标签使用上“达成共识”。LSR之间可以运行LDP来告知其他LSR本设备上的标签绑定信息,从而实现标签报文的正确转发。 LSR:Label Switch…

在Java中输入连续三个数字并进行升序排序

思想 使用for循环对数组中的元素进行排序:需要创建数组,然后使用for循环进行比较,再者对排序后的元素进行输出。 代码 import java.io.*; import java.util.*; public class Sequence {public static void main(String[] args) throws IO…

javascript之location常用属性和方法

文章目录 前言为什么使用location的属性和方法呢?属性展示hrefhosthostnameportprotocolpathname 方法展示replace(url)assign(url)reload()toString() 总结属性总结:方法总结: 前言 本章学习的是location常用属性和方法 为什么使用location的…

C#多条件排序OrderBy、ThenBy

方法和效果 有多个排序条件,其实不用单独自己写排序方法的,C#内置了排序方法: 引用命名空间System.Linq 正向排序的方法:OrderBy首要条件;ThenBy次要条件,可以连续多个使用 同理,逆向排序对应…

探秘交互设计:深入了解五大核心维度!

交互式设计是用户体验(UX)设计的重要组成部分。本文将解释什么是交互设计,并分享一些有用的交互设计模型,并简要描述交互设计师通常做什么。 如何解释交互设计 交互式设计可以用一个简单的术语来理解:它是用户和产品…

新火种AI|AI正在让汽车成为“消费电子产品”

作者:一号 编辑:小迪 AI正在让汽车产品消费电子化 12月28日,铺垫许久的小米汽车首款产品——小米SU7正式在北京亮相。命里注定要造“电车”的雷军,在台上重磅发布了小米的五大自研核心技术。在车型设计、新能源技术以及智能科技…

Python中使用SQLite数据库的方法2-1

1 SQLite数据库简介 SQLite数据库是一种轻量级的、优秀的开源关系型数据库。它使用Python的标准库实现,并且存储数据库在普通文件中。这些文件在不同机器和操作系统之间是可以移植的,在很多安卓手机中,也是把SQLite作为嵌入数据库使用。 2 …

暗光增强——Zero-DCE网络推理测试

目录 一、Zero-DCE方法1.1 网络优点1.2 网络适用场景1.3 网络不适用场景 二、源码包三、测试四、测试结果五、推理速度六、总结 一、Zero-DCE方法 Zero-DCE(Zero-Reference Deep Curve Estimation)是一种用于低光照增强的网络。 1.1 网络优点 无需参考…

昇腾910平台安装驱动、固件、CANN toolkit、pytorch

本文使用的昇腾910平台操作系统是openEuler,之前没了解过,不过暂时感觉用起来和centOS差不多。系统架构是ARM,安装包基本都是带aarch64字样,注意和x86_64区别开,别下错了。 安装依赖 cmake 通过yum安装的cmake版本较…

华为发布《智能世界2030》思维导图笔记

华为发布《智能世界2030》思维导图笔记

vmware虚拟机中Nat、桥接模式和仅主机的差别

NAT 在NAT模式下,主机3是Kali和Win两个操作系统的宿主机,那么Kali和Win可以连接到外网,也可以和主机3进行互联,但是主机1和主机2不能连接到Kali和Win。 桥接 在桥接模式下,主机3是Kali和Win两个操作系统的宿主机&…

Mybatis插件入门

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…