You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS:如何在使用app.close()优雅关闭应用时修改退出码为0?

解决NestJS调用app.close()后退出码为1的问题

我之前也碰到过这个情况,确实有点困惑——明明是正常调用app.close()做优雅关闭,结果进程退出码却是1,搞得像程序出了错误一样。其实这是NestJS的默认行为:调用app.close()时,框架会抛出一个ShutdownSignalException,这个异常会触发Node进程以退出码1终止。要在正常关闭场景下改成退出码0,有几种实用的方案:

方案一:手动监听关闭信号并设置退出码

我们可以自己监听系统的关闭信号(比如SIGINT也就是Ctrl+C,或者容器环境常用的SIGTERM),在调用app.close()完成后,主动指定退出码为0:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);

  // 监听用户按下Ctrl+C触发的SIGINT信号
  process.on('SIGINT', async () => {
    try {
      await app.close();
      console.log('应用已优雅关闭');
      process.exit(0); // 手动设置正常退出码
    } catch (err) {
      console.error('关闭应用时发生错误:', err);
      process.exit(1); // 真正出错时返回异常退出码
    }
  });

  // 监听容器环境常用的SIGTERM关闭信号
  process.on('SIGTERM', async () => {
    try {
      await app.close();
      console.log('应用已优雅关闭');
      process.exit(0);
    } catch (err) {
      console.error('关闭应用时发生错误:', err);
      process.exit(1);
    }
  });
}
bootstrap();

这种方式的优点是完全可控,你可以在关闭前后添加自定义的日志或资源清理逻辑。

方案二:用全局异常过滤器拦截ShutdownSignalException

如果不想手动监听信号,可以创建一个全局异常过滤器,专门捕获NestJS抛出的ShutdownSignalException,然后设置退出码为0:

首先创建过滤器:

import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { ShutdownSignalException } from '@nestjs/core';

@Catch(ShutdownSignalException)
export class ShutdownExceptionFilter implements ExceptionFilter {
  catch(exception: ShutdownSignalException, host: ArgumentsHost) {
    console.log('收到关闭信号,正在优雅关闭应用...');
    // 因为是应用关闭场景,不需要处理HTTP响应
    process.exit(0);
  }
}

然后在启动时注册这个全局过滤器:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new ShutdownExceptionFilter());
  await app.listen(3000);
}
bootstrap();

这个方案更贴合NestJS的异常处理机制,不用自己管理信号监听逻辑。

方案三:脚本/测试场景直接指定退出码

如果是在脚本或者测试代码中调用app.close(),可以在调用完成后直接手动设置退出码:

// 比如在测试结束后
await app.close();
process.exit(0);

这样就能确保正常关闭时进程以退出码0结束,只有当关闭过程中出现真正的错误时,才会返回退出码1。

内容的提问来源于stack exchange,提问作者rbutera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:37:37