如何使用Node.js的zlib解压AWS API Gateway的GzipStream数据?
解决Node.js解压.NET GzipStream生成的二进制数据报错问题
问题根源
你碰到的Z_DATA_ERROR(incorrect header check)错误,本质是接收的二进制数据已被转码损坏:AWS API Gateway默认会把非文本请求体当作UTF-8字符串解析,导致Gzip的二进制头和字节流被篡改,zlib无法识别合法的Gzip格式。
分步解决方案
1. 配置API Gateway支持二进制媒体类型
先让API Gateway正确传递二进制数据,避免转码:
- 登录AWS控制台,打开目标API的API Gateway页面
- 切换到「设置」标签,在「二进制媒体类型」列表中添加
application/gzip - 重新部署API,使配置生效
配置完成后,API Gateway会将Content-Type: application/gzip的请求体以Base64编码传递,同时isBase64Encoded字段会变为true。
2. 修正Node.js解压代码
针对Base64编码的二进制数据,调整解压逻辑:
const zlib = require('zlib'); // 示例Lambda处理函数(其他Node.js环境核心逻辑一致) exports.handler = async (event) => { // 将Base64编码的body解码为Buffer const compressedBuffer = Buffer.from(event.body, 'base64'); try { // 用gunzip专门处理Gzip格式(unzip同时支持gzip/deflate,gunzip更精准) const decompressed = await new Promise((resolve, reject) => { zlib.gunzip(compressedBuffer, (err, data) => err ? reject(err) : resolve(data)); }); // 解析为JSON对象 const jsonData = JSON.parse(decompressed.toString('utf8')); console.log('解析结果:', jsonData); return { statusCode: 200, body: JSON.stringify(jsonData) }; } catch (err) { console.error('处理失败:', err); return { statusCode: 500, body: JSON.stringify({ error: err.message }) }; } };
额外排查项
- 确认.NET端生成GzipStream时使用的是
CompressionMode.Compress模式,且原始数据是合法的JSON字符串 - 检查请求的
Content-Type是否严格为application/gzip,否则API Gateway不会按二进制处理
内容的提问来源于stack exchange,提问作者Yiffany
相关产品推荐
相关产品推荐

