Node.js Telegram聊天机器人部署Heroku后运行1分钟崩溃问题排查
核心故障原因
你遇到的1分钟崩溃问题90%是Heroku Web Dyno的端口绑定规则导致的:
Heroku的Web类型实例要求服务必须在启动后60秒内监听平台动态分配的PORT环境变量,如果超时未绑定端口,平台会判定服务启动失败,主动杀死进程,刚好对应你前1分钟正常、后续崩溃的表现。
你代码中虽然引入了express,但是完全没有启动HTTP服务监听端口的逻辑,自然无法通过平台的健康检查。
排查思路
- 执行
heroku logs --tail实时查看崩溃日志,确认是否出现Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch报错,这是端口未绑定的典型错误标识。 - 检查当前dyno类型,如果是Web类型必须满足端口监听要求,如果不想启动HTTP服务,可以将dyno切换为Worker类型,同时在项目根目录新增
Procfile文件,内容为worker: node app.js。 - 排查Telegram bot polling连接稳定性,确认是否因为网络波动导致polling断开后没有自动重连。
修复方案
- 补全端口监听逻辑,在你的代码末尾添加如下内容:
const PORT = process.env.PORT || 8080 app.get('/', (req, res) => res.send('Bot is running')) app.listen(PORT, () => console.log(`Service listening on port ${PORT}`))
- 移除Dockerfile中的敏感信息硬编码,不要把TOKEN直接写在Dockerfile里,登录Heroku后台进入应用设置页,在
Config Vars板块配置TOKEN变量,平台会自动注入到运行环境中。 - (可选优化)生产环境建议将Telegram bot的polling模式替换为webhook模式,性能和稳定性都更好,也能避免免费dyno因为无入站请求休眠的问题。
- (可选)优化bot polling配置,增加自动重连逻辑,修改bot初始化代码为:
const bot = new telegramBot(process.env.TOKEN, { polling: { autoStart: true, retryDelay: 3000 } })
内容的提问来源于stack exchange,提问作者Elguja Mtchedlidze
相关产品推荐
相关产品推荐

