NestJS 提供了生命周期钩子 —— 这些方法允许你在应用程序或提供者生命周期中的特定时刻运行代码(初始化和关闭)。它们对于设置(连接到资源)和清理(优雅地关闭连接)至关重要。
主要的钩子
()
, {
() {
.();
}
() {
.();
}
}
INITIALIZATION (startup):
onModuleInit() → after the module's providers are initialized
onApplicationBootstrap()→ after ALL modules are initialized (whole app ready)
SHUTDOWN (graceful termination):
onModuleDestroy() → cleanup as modules are destroyed
beforeApplicationShutdown() → before shutdown completes
onApplicationShutdown(signal) → final shutdown (signal = SIGTERM, etc.)
@Injectable()
export class PrismaService extends PrismaClient
implements OnModuleInit, OnModuleDestroy {
async onModuleInit() {
await this.$connect(); // connect on startup
}
async onModuleDestroy() {
await this.$disconnect(); // disconnect on shutdown — clean release
}
}
这是需要显式设置/拆卸的资源的标准模式 —— 在 onModuleInit 中连接,在 onModuleDestroy 中释放。
// shutdown hooks must be enabled explicitly
const app = await NestFactory.create(AppModule);
app.enableShutdownHooks(); // ❗ required for onApplicationShutdown etc. to fire
关闭钩子只有在你调用 enableShutdownHooks() 时才会运行 —— 容易忘记,然后清理工作就永远不会发生。
When the app receives SIGTERM (deploy, scale-down, container stop):
✗ Without shutdown hooks → connections left open, in-flight work dropped
✓ With shutdown hooks → close DB/Redis/queues cleanly, finish work → zero-downtime
生命周期钩子对于在 NestJS 应用程序中正确管理资源至关重要 —— 它们为初始化(打开数据库/Redis 连接、加载数据、向服务注册)以及关键的关闭时优雅清理(关闭连接、刷新缓冲区、完成进行中的工作)提供了正确的时机。
理解它们对于生产可靠性至关重要:初始化钩子(onModuleInit、onApplicationBootstrap)确保在依赖项准备好后在正确的时刻进行设置,而关闭钩子(onModuleDestroy、onApplicationShutdown)启用优雅关闭 —— 这在现代部署中至关重要(容器/编排器在部署和扩展期间持续发送 SIGTERM,如果没有适当的清理,你会泄露连接并丢弃活跃请求,破坏零停机部署)。
在 onModuleInit 中连接并在 onModuleDestroy 中断开连接的标准模式(例如针对 Prisma/数据库服务)是日常 NestJS 知识,而了解调用 enableShutdownHooks() 的微妙要求(否则关闭钩子会悄无声息地永不触发)是一个实用的、容易遗漏的细节。
掌握生命周期钩子是构建健壮的、生产就绪的 NestJS 服务的一部分,这些服务能够正确地处理资源和部署。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠