乐闻世界logo
搜索文章和话题

NestJS 如何在服务关闭时触发方法?

8 个月前提问
6 个月前修改
浏览次数53

1个答案

1

在NestJS中,您可以使用生命周期事件来在服务关闭时触发方法。NestJS 提供了一些钩子函数,您可以在应用的不同生命周期阶段执行代码。要在服务关闭时执行某些操作,您可以使用 onModuleDestroy 钩子或 onApplicationShutdown 钩子。

onModuleDestroy 钩子

onModuleDestroy 是一个由 NestJS 的 OnModuleDestroy 接口提供的方法,在模块被销毁之前调用。要使用它,您的类需要实现 OnModuleDestroy 接口。这个方法适合执行一些清理任务,但并不特定于应用程序关闭,它与模块的生命周期相关联。当模块即将被销毁时,这个方法会被调用。

typescript
import { Injectable, OnModuleDestroy } from '@nestjs/common'; @Injectable() export class SomeService implements OnModuleDestroy { onModuleDestroy() { console.log('Cleaning up before the module is destroyed...'); // 在这里实现您的清理逻辑 } }

onApplicationShutdown 钩子

onApplicationShutdown 钩子会在应用程序要被关闭前触发,您可以用它来做一些关闭前的准备工作,比如优雅地关闭数据库连接或者其他资源。要实现这个钩子,您的服务需要实现 NestJS 的 OnApplicationShutdown 接口。

typescript
import { Injectable, OnApplicationShutdown } from '@nestjs/common'; @Injectable() export class SomeService implements OnApplicationShutdown { onApplicationShutdown(signal?: string) { console.log(`Application is shutting down... Signal: ${signal}`); // 在这里实现关闭前的准备工作 } }

在这个方法里,您可以接收一个可选的 signal 参数,它会在 Node.js 应用收到类似 SIGINTSIGTERM 等关闭信号时被传递。

应用实例

假设您有一个服务需要在应用程序关闭时关闭数据库连接,您可以这样实现 onApplicationShutdown 钩子:

typescript
import { Injectable, OnApplicationShutdown } from '@nestjs/common'; import { DbService } from './db.service'; @Injectable() export class SomeService implements OnApplicationShutdown { constructor(private readonly dbService: DbService) {} onApplicationShutdown(signal?: string) { this.dbService.closeConnection(); console.log(`Database connection closed. Signal: ${signal}`); } }

在这个例子中,我们有一个 DbService 负责管理数据库连接。我们注入这个服务到 SomeService 里,并在应用程序关闭时通过调用 dbService.closeConnection() 方法来关闭数据库连接。

请记住,为了让 NestJS 能够调用这些钩子,您的服务必须被注入到应用程序的某个模块中。如果服务没有被模块使用,那么即使实现了这些接口和方法,NestJS 也不会调用它们。

2024年6月29日 12:07 回复

你的答案