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

news2024/11/26 12:49:23

前言

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.coloradmin.cn/o/1342808.html

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

相关文章

二、RK3588-安装Opencv-4.8.1(C++版本)

1.前言 OpenCV是一个跨平台的计算机视觉和机器学习软件库,基于Apache2.0许可(开源)发行。它可以在Linux、Windows、Android和Mac OS操作系统上运行。OpenCV由一系列C函数和少量C类构成,同时提供了Python、Ruby、MATLAB等语言的接口…

HALCON报错#2021:System clock has been set back 解决方案

如果操作系统修改过时间,再更新到正常的时间后,打开halcon可能会报错#2021:System clock has been set back. 解决方案: 1、联网同步Windows 系统时间。 2、检查以下目录中是否有超过当前时间的文件(删除&#xff09…

Java2023

文章目录 DOS系统正则表达式原理对象和类IDEA快捷键单例设计模式final关键字final使用注意事项抽象类接口内部类局部内部类(有类名)匿名内部类(无类名)★★成员内部类静态内部类枚举类型的使用Annotation注解异常try-catchthrows自定义异常十三章 包装类String 类的常用方法…

Prometheus 14 点实践经验分享

这是 2017 年的 promcon 的分享,原文地址在这里,作者 Julius Volz,今天偶然看到,虽然已经过去 6 年,有些实践经验还是非常值得学习。做个意译,加入一些自己的理解,分享给大家。 埋点方面 1. 所…

腾讯经典面试题-如何做一个迷你版的微信抢红包呢?

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

9个简单有效的用户需求分析方法,让你的产品更符合用户心理预期

作为一名互联网产品经理,需求分析是我们工作中最为重要的环节之一。正确地理解用户需求,为用户提供更好的产品体验,是我们的首要任务。以下是一些关于如何做好需求分析的建议,希望对大家有所帮助。 了解用户 在需求分析的过程中&a…

羊大师讲解,羊奶怎么加热才不容易破坏营养

羊大师讲解,羊奶怎么加热才不容易破坏营养 随着人们对健康饮食的重视,越来越多的人开始选择羊奶作为补充营养的饮品。在加热羊奶的过程中,如果方法不当,很容易造成营养价值的损失。那么,如何加热羊奶才能最大程度地保…

腾讯云轻量应用服务器性能差吗?

腾讯云轻量应用服务器性能如何?轻量服务器CPU采用什么型号?处理器计算性能如何?轻量应用服务器会不会比云服务器CVM性能差?腾讯云服务器网txyfwq.com详解轻量CPU型号主频、处理器性能、内存、公网带宽、月流量、不同地域速度测试、…

共享单车之租赁需求预估

文章目录 第1关:数据探索与可视化第2关:特征工程第3关:租赁需求预估 第1关:数据探索与可视化 相关知识 为了完成本关任务,你需要掌握: 读取数据 数据探索与可视化 读取数据 数据保存在./step1/bike_train…

Gooxi受邀出席操作系统与AI技术应用实践沙龙·OC城市行·深圳站活动

2023年是大模型元年,国内诸多AI、互联网公司争先恐后加码投入“练模”。AI产业快速发展行业高速运转,业内人称这是继蒸汽机、计算机之后开启新一轮科技革命的技术。但AI大模型是一个资本密集、人才密集和数据密集的产业,如何促进AI大模型落地…

Java之程序、进程、线程、管程和并发、并行的概念

文章目录 1. 进程与线程1.1 程序1.2 进程1.3 线程1.4 管程 2.并行与并发2.1 并发2.2 并行 1. 进程与线程 1.1 程序 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。简单的说就是我们写的代码。 1.2 进程 (1&…

05-认证服务中多种认证方式的实现

多种认证方式 统一认证入口 目前各大网站支持账号密码认证、手机验证码认证、扫码登录认证等多种认证方式,Spring Security框架也支持多样化的认证方案 账号和密码认证: 采用OAuth2协议的密码模式即可实现手机号加验证码认证: 用户认证提交的是手机号和验证码并不是账号和密…

软件测试/测试开发丨Windows Appium环境搭建

windows 版本 Appium 环境搭建 安装 nodejs 下载.msi文件 https://nodejs.org/en/download/ 注意: 1、下载12.*版本双击安装即可。 2、无须配置环境变量,直接重启一个 cmd 输入下面的命令,能够查看这两个版本号即安装成功。 安装 appium desktop 直…

如何在Docker环境下安装火狐浏览器并结合内网穿透工具实现公网访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

【LeetCode】修炼之路-0001-Two Sum(两数之和)【python】【简单】

前言 计算机科学作为一门实践性极强的学科,代码能力的培养尤为重要。当前网络上有非常多优秀的前辈分享了LeetCode的最佳算法题解,这对于我们这些初学者来说提供了莫大的帮助,但对于我这种缺乏编程直觉的学习者而言,这往往难以消化吸收。(为什么别人就能想出这么优雅…

tcp/ip实现两个手机之间连接同步显示

app主界面 选择一:TCP客户端 选择二:TCP服务端 点击下图item时进入曲线绘制页面 如果是服务器端它不需要连任何设备就可以直接进入绘制界面如果是TCP的话就不能直接进入,否则就会提示未连接网络连接不能放在主线程,页面去调方法&…

Java限流方案常用算法详解 固定时间窗口 滑动时间窗口 漏桶限流 令牌桶限流

前言 为什么要做限流? 服务需要保护自己,以免被太多的请求淹没(无论是恶意或无意的),从而保持可用性。 举个生活中的例子,某个景区,平时可能根本没什么人前往,但是一旦到了国庆假日…

Python中的并发编程(7)异步编程

异步编程 Python3.4后新增了asyncio模块,支持异步编程。 异步是在一个线程中通过任务切换的方式让多个任务”同时“进展。asyncio不涉及线程/进程切换,减少了线程/进程创建、上下文切换的开销,更轻量级。 asyncio的核心是事件循环&#xff0…

仓储3代电子标签接口文档-V1.2

电子标签标签注册 通过手动触发电子标签注册到系统,注册成功就可以进行功能测试。 仓储3代注册 方式1:(四灯外供电版本标签) 标签左测中间按键连按三次 方式2:(电池供电版本标签) 标签右下角左下角按键&#xff0…

开放网络+私有云=?星融元的私有云承载网络解决方案实例

在全世界范围内的云服务市场上,开放网络一直是一个备受关注的话题。相比于传统供应商的网络设备,开放网络具备软硬件解耦、云原生、可选组件丰富等优势,对云服务商和超大型企业有足够的吸引力。 SONiC作为开源的网络操作系统,使得…