NodeJS Axios调用返回S3预签名URL的API出现乱码问题求助
问题原因及解决方案
问题分析
你遇到的乱码问题,核心原因是响应数据被压缩后Axios未自动解压:
- Postman会自动识别并处理gzip/deflate格式的压缩响应,因此能正常解析JSON结果;
- Node.js环境下的Axios默认不会自动解压压缩后的二进制数据,直接输出就会显示乱码。
另外注意你的Axios请求URL缺少协议头(http://),虽然部分环境能自动补全,但规范写法应该加上,避免请求解析异常。
解决方案
方案1:手动配置Axios解压压缩响应
借助Node.js内置的zlib模块处理压缩数据,修改service2的Axios代码如下:
const zlib = require('zlib'); const axios = require('axios'); async getDocument() { try { // 补全协议头,指定响应类型为二进制,明确接受压缩编码 const response = await axios.get('http://localhost:4000/documents', { responseType: 'arraybuffer', headers: { 'Accept-Encoding': 'gzip, deflate' } }); let parsedData; const contentEncoding = response.headers['content-encoding']; // 根据压缩类型解压并解析JSON if (contentEncoding === 'gzip') { parsedData = await new Promise((resolve, reject) => { zlib.gunzip(response.data, (err, result) => { if (err) reject(err); resolve(JSON.parse(result.toString())); }); }); } else if (contentEncoding === 'deflate') { parsedData = await new Promise((resolve, reject) => { zlib.inflate(response.data, (err, result) => { if (err) reject(err); resolve(JSON.parse(result.toString())); }); }); } else { // 未压缩直接解析 parsedData = JSON.parse(response.data.toString()); } console.log('XXXXXXXXXXXX', parsedData); return parsedData; } catch (error) { logger.error(error); } }
方案2:临时禁用service1的压缩功能(用于验证)
如果你的service1使用了compression中间件开启gzip压缩,可以先注释该中间件测试:
// service1中的代码,注释压缩中间件 // const compression = require('compression'); // app.use(compression());
若此时Axios能正常获取JSON,说明确实是压缩导致的问题,再采用方案1处理即可。
方案3:使用Axios自动解压插件(可选)
安装axios-gzip插件自动处理压缩响应:
npm install axios-gzip
配置Axios实例:
const axios = require('axios'); const axiosGzip = require('axios-gzip'); const instance = axiosGzip(axios.create()); async getDocument() { try { const response = await instance.get('http://localhost:4000/documents'); console.log('XXXXXXXXXXXX', response.data); return response.data; } catch (error) { logger.error(error); } }
内容的提问来源于stack exchange,提问作者Poor programmer
相关产品推荐
相关产品推荐

