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

如何优雅关闭Node.js Express应用?该功能是否需实现?

关于Express服务器优雅关闭的问题解答

是否需要实现该功能?

非常有必要,尤其是你的业务涉及电商支付、发货这类核心交易链路:

  • 当服务器收到终止信号(比如Docker容器停止、云主机停机发送的SIGTERM,或是本地Ctrl+C触发的SIGINT),默认情况下Node.js会直接终止进程,未完成的请求会被强制中断。
  • 如果中断发生在carrierAPI.createShipping这类关键步骤后、响应返回前,会导致数据不一致(比如用户已付款但未生成发货单),直接损害业务可信度。
  • 优雅关闭能确保服务器停止接收新请求,同时等待所有已接收的请求处理完成后再退出,完全避免这类问题。

现有代码是否存在冗余?

有多处冗余和需要修正的问题:

  1. 重复绑定SIGINT事件:你先后绑定了两个SIGINT回调,会导致信号触发时两次执行不同逻辑,属于冗余,需删除第一个无关的SIGINT绑定。
  2. 多余的process.stdin.resume():这行代码用于防止无异步任务的Node进程自动退出,但你的Express服务器已在监听端口,本身就是异步任务,进程不会自动退出,所以这行可以删掉。
  3. 未处理进程退出:server.close()的回调触发时,所有请求已处理完成,但进程可能因残留异步资源无法自动退出,需手动调用process.exit(0)。
  4. 无超时兜底:如果某些请求卡住(比如第三方API超时),会导致进程一直挂着无法退出,建议添加超时强制退出的逻辑。
  5. 拼写错误:回调里的log应为console.log,否则会抛出未定义错误。

修正后的优雅关闭代码

// ./src/app.ts
import process from 'node:process';

function gracefulClose(signal) {
  console.log(`收到信号 ${signal},开始优雅关闭服务器`);
  server.close(() => {
    console.log('HTTP(S)服务器已关闭,所有请求处理完成');
    process.exit(0); // 主动退出,清理残留资源
  });

  // 30秒超时兜底,避免进程无限挂起
  setTimeout(() => {
    console.error('优雅关闭超时,强制终止进程');
    process.exit(1);
  }, 30000);
}

process.on('SIGINT', gracefulClose);
process.on('SIGTERM', gracefulClose);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:43:14