Node.js使用Axios下载气象卫星/雷达图片时部分站点返回502 Bad Gateway问题求助
解决Axios在公司代理下请求气象站点图片返回502 Bad Gateway的问题
我来帮你梳理下这个问题的可能原因和对应的解决方案,毕竟你已经确认代理在其他站点能正常工作,说明问题大概率出在请求细节或者代理与目标站点的交互上:
1. 模拟浏览器请求头,避免被拦截
很多站点(包括气象服务类)会验证请求的User-Agent等标识,Axios默认的请求头会暴露是脚本发起的请求,可能被目标站点或公司代理的安全策略拦截。
你可以完全复制浏览器请求的头信息到Axios配置里,比如:
return Axios({ method: 'get', url: fileUrl, params: params, proxy: { /* 你的代理配置 */ }, responseType: 'stream', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept': 'image/gif, image/jpeg, image/png, image/svg+xml, */*', 'Accept-Language': 'en-US,en;q=0.9', 'Referer': 'https://radar.weather.gov/' // 针对雷达站点,模拟从官网跳转的请求 } })
提示:你可以在浏览器开发者工具的Network面板里,找到对应图片请求的Request Headers,直接复制所有字段过来,确保和浏览器请求完全一致。
2. 排查代理的SSL/TLS交互问题
从响应头里的squid/4.13和ERR_READ_ERROR来看,代理服务器在和目标站点建立SSL连接时可能出了问题:比如目标站点的证书不被代理信任,或者代理不支持目标站点要求的TLS版本。
你可以尝试以下两种方式:
- 指定TLS版本并临时跳过证书验证(仅测试用):
const https = require('https'); const sslAgent = new https.Agent({ minVersion: 'TLSv1.2', // 匹配目标站点支持的TLS版本,很多气象站点用TLS1.2+ rejectUnauthorized: false // 仅测试时用,生产环境不要开启,避免安全风险 }); return Axios({ // ...其他配置 httpsAgent: sslAgent }) - 联系公司IT团队:确认代理是否允许访问该目标站点的443端口,是否存在证书拦截(比如公司的根证书未被Node.js信任)。
3. 尝试更换响应类型,绕过流式传输的代理限制
你当前用了responseType: 'stream',部分代理服务器对分块流式响应的处理可能有兼容性问题。可以先尝试获取二进制buffer再写入文件:
return Axios({ method: 'get', url: fileUrl, params: params, proxy: { /* 你的代理配置 */ }, responseType: 'arraybuffer' // 改为arraybuffer类型 }).then((response) => { fs.writeFileSync(outputLocationPath, response.data); return response; })
这种方式一次性获取完整响应,避免代理在流式传输中出现中断。
4. 调试建议
- 对比浏览器和Axios请求的所有细节:包括请求头、Cookie(如果有)、请求方式等,确保没有遗漏关键字段。
- 直接在本地环境(脱离公司代理)测试目标站点的请求,如果能正常获取,说明问题完全出在代理与目标站点的交互上,需要和IT团队协作排查代理日志。
内容的提问来源于stack exchange,提问作者Lazaro Falcon
相关产品推荐
相关产品推荐

