使用域名:Port调用Axios返回乱码,IP:Port正常的问题排查
Axios请求域名返回乱码、IP正常的解决方法
问题场景
在Node.js应用中使用Axios发送GET请求时,出现以下异常:
- 用域名+端口访问(如
http://my-domain:2095/server/get-status)返回乱码(预期为JSON格式) - 直接用IP+端口访问时响应正常
- 浏览器和Postman访问域名地址能得到正常JSON响应
请求代码:
axios.get(`http://my-domain:2095/server/get-status`) .then(result => { console.log(result.data) });
返回的乱码示例:
\x1F�\b\x00\x00\x00\x00\x00\x00\x03tα\x0E� \x14\x05�\x7F�3\x03/
��\f��8���\x12�\x04i\x17¿�j��g8\x15{Z%Ep�*��(9�\r<U�\x02\x06\r�x\x07���\��E0�^[OD�j��U�\x7F���r�)���mV�a�\x1D<�M�\x15R\x19���xc�\x04\x00\x00��\x03\x00\x02d&��\x00\x00\x00
原因分析
乱码开头的\x1F是Gzip压缩的标识,说明服务器返回了Gzip压缩的数据,但Axios在Node.js环境下未自动完成解压。
域名和IP访问的差异,大概率是因为域名指向的前端代理(如Nginx)开启了Gzip压缩,而直接访问IP的后端服务未启用压缩;或者Axios请求域名时,请求头未携带Accept-Encoding字段,导致服务器默认返回压缩数据——而浏览器和Postman会自动发送该请求头并处理解压逻辑。
解决方法
方法一:强制服务器返回未压缩数据
在请求头中添加Accept-Encoding: identity,明确告诉服务器返回原始未压缩的内容:
axios.get(`http://my-domain:2095/server/get-status`, { headers: { 'Accept-Encoding': 'identity' } }) .then(result => { console.log(result.data) });
方法二:让Axios自动处理Gzip解压
Node.js环境下可通过两种方式实现自动解压:
- 手动借助zlib模块处理
const zlib = require('zlib'); const axios = require('axios'); axios.get(`http://my-domain:2095/server/get-status`, { responseType: 'arraybuffer', // 先获取二进制原始数据 transformResponse: [function (data) { // 根据响应头判断是否需要解压 const contentEncoding = this.headers['content-encoding']; if (contentEncoding && contentEncoding.includes('gzip')) { return zlib.gunzipSync(data).toString(); } return data.toString(); }] }) .then(result => { console.log(JSON.parse(result.data)) });
- 开启Axios内置的解压配置
Axios 0.21.0+版本支持直接开启decompress配置(Node.js环境默认已开启,手动指定可避免场景化失效):
axios.get(`http://my-domain:2095/server/get-status`, { decompress: true }) .then(result => { console.log(result.data) });
内容的提问来源于stack exchange,提问作者Soroush Bgm
相关产品推荐
相关产品推荐

