部署Hardhat节点到Heroku后调用web3.eth.getBalance()报错求助
问题解决步骤
核心问题分析
你遇到的R10 (Boot timeout)错误和JSON-RPC响应无效问题,根源是Hardhat Node启动时绑定了本地回环地址和固定端口,不符合Heroku的运行规则:
- Heroku要求应用必须监听
0.0.0.0(而非127.0.0.1),允许外部访问 - 必须使用Heroku自动分配的
$PORT环境变量,不能硬编码8545端口
步骤1:修改Hardhat启动命令
把启动脚本改成绑定0.0.0.0和Heroku的动态端口:
npx hardhat node --host 0.0.0.0 --port $PORT
步骤2:更新package.json的启动脚本
在项目的package.json里,将start字段替换成:
{ "scripts": { "start": "npx hardhat node --host 0.0.0.0 --port $PORT" } }
步骤3:修复Web3连接代码的混用问题
你的代码同时用了await和回调函数,Web3的getBalance支持Promise语法,建议简化成:
const Web3 = require("web3"); // 直接用Heroku应用域名,不需要加端口(Heroku会自动反向代理) const web3 = new Web3("https://{myapp}.herokuapp.com"); async function getBalance(accountAddress) { console.log("Get Account balance called", accountAddress); try { const balanceInWei = await web3.eth.getBalance(accountAddress); const balanceInEth = web3.utils.fromWei(balanceInWei, "ether"); console.log("Balance : ", balanceInEth, " ETH"); return balanceInWei; } catch (err) { console.error("Error while retrieving account balance :", err); return 0; } }
步骤4:验证部署状态
重新部署到Heroku后,查看日志确认:
- 日志显示
Started HTTP and WebSocket JSON-RPC server at http://0.0.0.0:XXXX/(XXXX是Heroku分配的端口) - 没有
R10错误,应用状态为up
额外注意事项
- Hardhat Node是测试节点,Heroku免费dyno休眠或重启后,所有链上数据会重置,这是正常特性
- 如果需要持久化测试链数据,建议改用Ganache等支持数据持久化的节点工具
内容的提问来源于stack exchange,提问作者Surya Flash
相关产品推荐
相关产品推荐

