You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:22:32