如何让部署在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) }) - Heroku 给
内容的提问来源于stack exchange,提问作者BlueBeret
相关产品推荐
相关产品推荐

