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

如何让部署在Heroku的Node.js应用在进入休眠前执行自定义操作

Heroku Node.js 应用休眠前执行指定函数的实现方案

Heroku dyno 在进入休眠、重启、实例缩容时,会先向运行的进程发送SIGTERM信号,你可以通过监听该信号触发你的prepareIdle()逻辑:

  • 首先在app.js主文件中添加信号监听代码:
// 先保留你的HTTP服务启动逻辑,拿到server实例
const express = require('express')
const app = express()
const server = app.listen(process.env.PORT || 3000, () => {
  console.log('服务启动成功')
})

// 你已经定义好的休眠前置函数
async function prepareIdle() {
  // 你的原有逻辑
}

// 监听SIGTERM信号,Heroku休眠前会触发该信号
process.on('SIGTERM', async () => {
  console.log('收到休眠信号,开始执行前置操作')
  try {
    // 先关闭HTTP服务,停止接收新请求,避免请求处理被中途中断
    server.close()
    // 调用你定义的休眠前置函数,异步逻辑必须加await等待执行完成
    await prepareIdle()
    console.log('休眠前置操作执行完成')
  } catch (err) {
    console.error('休眠前置操作执行失败:', err)
  } finally {
    // 操作完成后主动退出进程
    process.exit(0)
  }
})
  • 注意事项:
    • Heroku 给SIGTERM信号的响应超时时间为30秒,超时后会直接发送SIGKILL强制终止进程,你的prepareIdle()执行时长不能超过30秒,耗时较长的操作需要提前做拆分优化
    • 本地调试时可以新增SIGINT信号监听,Ctrl+C终止进程时就会触发对应逻辑,方便本地测试:
    process.on('SIGINT', async () => {
      server.close()
      await prepareIdle()
      process.exit(0)
    })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:48:03