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

部署持续发送POST请求的Node.js应用到Heroku遇R10错误求助

解决Heroku部署Node.js定时任务的R10启动超时错误

这个问题的核心原因是Heroku对web进程的默认约束:它认为所有web类型的进程都需要提供HTTP服务,必须在启动后60秒内绑定到$PORT环境变量指定的端口。但你的脚本只是一个定时发送请求的后台任务,没有启动任何Web服务器,所以Heroku检测到端口未绑定,就触发了R10超时错误并终止了进程。

下面给你两个可行的解决方案,推荐用第一个:

方案1:将进程类型改为Worker(更适合后台任务)

Worker进程是Heroku专门用来运行后台任务的类型,不需要绑定端口,完全匹配你的脚本场景。

  1. 在项目根目录新建一个名为Procfile的文件(注意首字母大写,没有后缀),内容如下:
worker: node fetch.js
  1. 把Procfile提交到Git仓库:
git add Procfile
git commit -m "Switch to worker process type for voting task"
git push heroku main
  1. 启动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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:28:10