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
相关产品推荐
相关产品推荐

