在Heroku上运行node-fetch时持续出现403错误,本地运行正常的技术求助
解决Heroku部署后调用TrueMoney礼品卡接口出现403的问题
这问题我之前帮朋友排查过类似的——本地跑完全正常,一部署到Heroku就报403,大概率是TrueMoney的礼品卡兑换接口对请求的来源或请求格式做了限制,给你拆解几个最可能的原因和对应的解决办法:
1. 缺少关键请求头(最常见的原因)
本地环境里不管是浏览器还是Node.js的默认fetch配置,通常都会带上User-Agent这类标识,但Heroku上的Node.js进程发起的请求如果没显式指定这些头,很容易被目标服务器识别为“非合法客户端请求”直接拦截。
你可以给fetch请求加上模拟浏览器的User-Agent,甚至额外加上Origin或Referer头试试:
const fetch_res = await fetch(`https://gift.truemoney.com/campaign/vouchers/${gift}/redeem`, { method: "post", headers: { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Origin": "https://gift.truemoney.com" // 模拟从官网发起的请求 }, body: JSON.stringify(body) })
2. Heroku的共享IP被拉黑
Heroku免费版的dyno用的是共享IP池,如果这个IP池里的某个IP之前被TrueMoney的反爬系统标记过,你的请求就会被连带拦截。可以试试:
- 重启dyno换IP:在终端执行
heroku restart,让Heroku给你的应用分配新的共享IP - 如果是付费dyno,可以考虑使用固定IP插件(不过需要额外付费)
3. 环境变量配置有误
虽然你说本地正常,但还是要确认Heroku上的MOBILE环境变量是不是正确配置了:
- 用终端命令检查:
heroku config:get MOBILE,对比本地的环境变量值是否完全一致 - 万一变量没设置或者值有误,请求体的参数不合法,有些服务会返回403而不是更直观的400错误
4. 请求体参数voucher_hash异常
你代码里的url变量作为voucher_hash的值,要确保在Heroku环境里是正确的:
- 是不是从外部请求(比如接口参数)获取的?有没有在部署后出现空值或无效值的情况?
- 本地测试时可能用的是固定的有效哈希,但部署后如果逻辑出错导致参数无效,也会触发服务器的403拦截
额外排查技巧
如果以上方法都没用,建议在Heroku上打印更详细的请求和响应信息:
// 打印请求头和请求体 console.log("Request Headers:", JSON.stringify({ "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" })); console.log("Request Body:", JSON.stringify(body)); // 打印响应的完整内容(不仅仅是json) const rawResponse = await fetch_res.text(); console.log("Raw Response:", rawResponse);
通过这些日志,你能看到服务器返回的具体错误描述,比只看status.code更有助于定位问题。
内容的提问来源于stack exchange,提问作者Elstargo
相关产品推荐
相关产品推荐

