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

Heroku免费层部署Node.js+Puppeteer长时运行任务无返回问题咨询

问题根本原因(Heroku免费层限制说明)

不是完全无法支持,但是你的当前代码逻辑刚好命中了Heroku免费层的多个默认限制,才会出现无返回无报错的情况:

  • 路由超时限制:Heroku所有层的Web进程都强制要求请求必须在30秒内返回响应,免费层也不支持修改该规则。你的任务涉及数百次页面访问和交互,本地运行就耗时较长,必然会触发超时限制,连接被强制断开,所以看不到返回结果。
  • 内存不足:Heroku免费层仅提供512MB运行内存,你当前代码用Promise.all同时创建数百个Puppeteer页面实例,单个页面就需要数十MB内存,触发OOM后进程会被系统直接kill,可能没来得及输出错误日志。
  • 并发连接限制:免费层对出站并发连接有默认限制,同时向同一个站点发起数百次请求,要么触发目标站点的反爬限制返回403/验证码,要么被Heroku的网络规则拦截。

调试方法

  • 先做并发控制改造:不要一次性启动所有任务,使用并发限制工具(比如p-limit)把同时运行的任务数控制在2~3个,避免直接触发内存溢出。示例修改如下:
// 引入p-limit,设置并发数为2
const limit = pLimit(2);
await Promise.all(
  items.map(item => limit(async () => {
    // 原有任务逻辑不变
  }))
)
  • 补充全链路日志:在每个操作步骤补充日志输出,比如页面创建完成、跳转完成、搜索提交、结果获取成功/失败的节点都打日志,catch错误时输出完整的err.stack而非仅错误对象,同时监听browser的disconnected事件,判断是否是浏览器实例被异常kill:
browser.on('disconnected', () => {
  console.error('Puppeteer浏览器被异常关闭');
});
  • 小批量测试验证:先截取前5条数据做测试,不要一次性跑全量数百条数据,先验证小流量下逻辑是否正常,再逐步扩容。
  • 增加页面快照排查:在报错节点或固定步骤将当前页面的截图、HTML源码打印或存储,判断是否遇到了反爬验证、页面加载失败、元素不存在等本地未出现的问题。
  • 本地模拟限制测试:本地启动时限制Node进程内存为512MB,同时给接口加30秒超时限制,复现Heroku的运行环境,排查本地可复现的问题。

长期适配方案

  • 如果你是提供HTTP接口服务,改为异步任务模式:收到请求后先返回任务ID,将爬取任务放到后台队列执行,执行完成后将结果存储到数据库/缓存,前端通过任务ID轮询获取结果,避开30秒路由超时限制。
  • 复用页面实例:不要每次执行任务都创建新页面再关闭,提前创建2~3个页面实例循环复用,大幅降低内存和启动开销。

内容的提问来源于stack exchange,提问作者Eduardo João

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:15:04