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

如何修复Heroku部署Node.js服务器时的启动错误?

解决Node.js部署到Heroku的两个关键问题

从你的日志来看,有两个核心问题需要依次解决,先处理根源性的Promise拒绝错误,再解决端口绑定超时的问题:

1. 修复「Only absolute URLs are supported」错误

这个错误是导致服务器启动失败的直接原因——你的代码里用http-link-dataloader调用GraphQL接口时传入了相对URL,但Node环境下的node-fetch(被cross-fetch封装)不支持相对路径,必须使用完整的绝对URL。

具体处理步骤:

  • 找到初始化BatchedGraphQLClient的代码,把API地址改成完整的绝对路径,比如https://your-graphql-api.com/graphql,而不是/graphql
  • 为了适配本地开发和Heroku生产环境,建议用环境变量来配置:
    // 本地开发用localhost地址,Heroku上通过环境变量设置生产地址
    const graphqlApiUrl = process.env.GRAPHQL_API_URL || 'http://localhost:4000/graphql';
    const client = new BatchedGraphQLClient(graphqlApiUrl, {
      // 你的客户端配置
    });
    
  • 一定要处理Promise的错误:给GraphQL客户端的调用加上.catch()捕获,或者在async函数里用try/catch包裹,避免未处理的Promise拒绝直接导致服务器崩溃。

2. 解决Heroku R10启动超时错误

日志里的Error R10 (Boot timeout)是因为服务器在60秒内没绑定到Heroku指定的$PORT,但这个问题大概率是第一个错误导致的——服务器还没走到listen步骤就崩溃了。

确认端口绑定的细节:

  • 确保你正确读取了Heroku的环境变量:const PORT = process.env.PORT;,Heroku会自动设置这个变量,不需要手动指定
  • 在listen回调里加个日志,方便确认服务器是否正常启动:
    server.listen({ port: PORT || 3000 }, '0.0.0.0', () => {
      console.log(`✅ Server started on port ${PORT || 3000}`);
    });
    
    修复第一个错误后,重新部署到Heroku,查看日志如果出现这条日志,就说明端口绑定成功了。

额外排查建议

  • 确认package.json里的start命令是正确的,从你的日志看"start": "node dist/index.js"没问题
  • 检查代码中是否还有其他未处理的异步错误,这些都可能中断服务器启动流程
  • 如果修复后还是有问题,尝试重启Heroku的dyno:heroku restart

内容的提问来源于stack exchange,提问作者Chu van tinh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:42:50