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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:11:27