部署持续发送POST请求的Node.js应用到Heroku遇R10错误求助
解决Heroku部署Node.js定时任务的R10启动超时错误
这个问题的核心原因是Heroku对web进程的默认约束:它认为所有web类型的进程都需要提供HTTP服务,必须在启动后60秒内绑定到$PORT环境变量指定的端口。但你的脚本只是一个定时发送请求的后台任务,没有启动任何Web服务器,所以Heroku检测到端口未绑定,就触发了R10超时错误并终止了进程。
下面给你两个可行的解决方案,推荐用第一个:
方案1:将进程类型改为Worker(更适合后台任务)
Worker进程是Heroku专门用来运行后台任务的类型,不需要绑定端口,完全匹配你的脚本场景。
- 在项目根目录新建一个名为
Procfile的文件(注意首字母大写,没有后缀),内容如下:
worker: node fetch.js
- 把
Procfile提交到Git仓库:
git add Procfile git commit -m "Switch to worker process type for voting task" git push heroku main
- 启动Worker进程并停止默认的Web进程(因为你不需要Web服务):
heroku ps:scale web=0 worker=1
做完这几步,Heroku就会以Worker进程的方式运行你的定时任务,再也不会因为端口绑定问题报错了。
方案2:给脚本添加一个极简Web服务器(仅当必须用web进程时使用)
如果因为某些限制你必须使用web进程类型,可以给脚本加一个最基础的HTTP服务器来满足端口绑定要求:
修改你的fetch.js,在脚本开头或者末尾添加这段代码:
const http = require('http'); // 创建一个简单的HTTP服务器,绑定Heroku提供的端口 const server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Voting service is running\n'); }); const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`Server listening on port ${PORT}`); });
这样脚本启动后会同时运行定时任务和这个极简Web服务器,满足Heroku对web进程的端口要求,R10错误就会消失。
额外注意事项
- 确保
request包已经在你的package.json依赖中,如果没有,执行npm install request --save,然后提交更新后的package.json和package-lock.json到Git。 - 用Worker进程的话,Heroku免费额度支持1个Worker进程运行,不用担心额外费用。
内容的提问来源于stack exchange,提问作者Fazwelington
相关产品推荐
相关产品推荐

