为何AWS Lambda中Axios调用外部API返回编码字符?
解决AWS Lambda中Axios调用JIRA API返回乱码的问题
问题原因
这种乱码通常是因为JIRA API返回了gzip压缩的响应,但AWS Lambda环境下的Axios默认未自动处理解压,导致原始压缩数据被直接输出,出现异常编码字符。Postman和本地Express服务器会自动处理gzip解压,所以能正常显示JSON。
解决方案
方案1:配置Axios自动处理压缩
在Axios请求配置中添加Accept-Encoding头,并显式开启自动解压(确保Lambda环境下Axios能识别并处理压缩响应):
let response = await axios.post( 'https://jira.com/rest/api/2/issue', payload, { auth: { username: process.env.JIRA_USER, password: process.env.JIRA_PASS }, headers: { 'Accept-Encoding': 'gzip, deflate' }, decompress: true // 显式开启自动解压 }, ); console.log(response.data)
方案2:手动解压响应数据
如果方案1无效,可通过Node.js的zlib模块手动解压二进制响应数据:
const zlib = require('zlib'); const { promisify } = require('util'); const gunzip = promisify(zlib.gunzip); let response = await axios.post( 'https://jira.com/rest/api/2/issue', payload, { auth: { username: process.env.JIRA_USER, password: process.env.JIRA_PASS }, responseType: 'arraybuffer' // 以二进制格式获取原始响应 }, ); // 判断响应是否为gzip压缩格式并解压 if (response.headers['content-encoding'] === 'gzip') { const decompressedData = await gunzip(response.data); const jsonData = JSON.parse(decompressedData.toString('utf8')); console.log(jsonData); } else { console.log(response.data); }
方案3:对齐Lambda与本地的Node.js版本
确保Lambda使用的Node.js LTS版本(如18.x或20.x)与本地测试环境一致,部分旧版本Node.js的HTTP模块对压缩响应的处理存在兼容性差异。
内容的提问来源于stack exchange,提问作者frine
相关产品推荐
相关产品推荐

