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

express.raw()未自动解压zlib压缩对象的技术问题咨询

解决Express中DEFLATE压缩请求的解压问题

Express默认不会自动处理DEFLATE格式的请求体,需要手动配置中间件并调用zlib模块完成解压,以下是具体实现步骤:

  • 第一步:获取原始二进制请求体
    禁用默认的JSON/URL编码解析中间件,改用express.raw()获取完整的原始Buffer数据,避免二进制内容被篡改。

    const express = require('express');
    const zlib = require('zlib');
    const app = express();
    
    // 配置raw中间件接收二进制请求,匹配实际发送的Content-Type
    app.use(express.raw({ type: 'application/octet-stream' }));
    
  • 第二步:编写解压路由逻辑
    利用zlib的inflate()方法处理符合RFC1950标准的DEFLATE数据(带zlib头),将解压后的Buffer转换为Uint8Array返回。

    app.post('/decompress', (req, res) => {
      zlib.inflate(req.body, (err, decompressedBuf) => {
        if (err) {
          return res.status(500).send(`解压失败:${err.message}`);
        }
        // 将Buffer转为Uint8Array并返回
        const decompressedUint8 = new Uint8Array(decompressedBuf);
        res.setHeader('Content-Type', 'application/octet-stream');
        res.send(decompressedUint8);
      });
    });
    
    app.listen(3000, () => {
      console.log('服务运行在3000端口');
    });
    
  • 浏览器端请求注意事项
    发送请求时需指定正确的Content-Type,直接传递Uint8Array二进制数据,避免转码:

    // 示例压缩数据(包含x'68de'头部)
    const compressedData = new Uint8Array([0x68, 0xde, /* 后续压缩字节 */]);
    fetch('http://localhost:3000/decompress', {
      method: 'POST',
      body: compressedData,
      headers: { 'Content-Type': 'application/octet-stream' }
    })
    .then(res => res.arrayBuffer())
    .then(buf => {
      const result = new Uint8Array(buf);
      // 处理解压后的数据
    });
    

关键注意点

  1. 不要同时使用express.json()或express.urlencoded(),会破坏二进制请求体
  2. 确认压缩格式:x'68de'是zlib头标识,必须用zlib.inflate()而非inflateRaw()(后者用于无zlib头的RFC1951原始DEFLATE)
  3. 确保Chromebook Linux容器的端口映射正常,浏览器能访问到服务端口

内容的提问来源于stack exchange,提问作者John Lundborg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:22:34