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

如何禁用Express的JSON解析并获取原始请求体?

获取Express JSON接口的原始请求体(Buffer/字符串)

核心问题原因

你的配置失效大概率是因为**express.json()中间件先于express.raw()被加载**——Express中间件按执行顺序处理请求,一旦express.json()解析了请求体,后续的raw中间件就无法获取原始数据了。

解决步骤

1. 移除全局JSON解析中间件

首先检查代码中是否存在全局的express.json()或bodyParser.json(),必须删除这些配置,否则原始请求体会被提前解析:

// 要删除的代码示例
// webhookApp.use(express.json());
// webhookApp.use(bodyParser.json());

2. 正确配置express.raw()中间件

根据需求选择全局或路由级配置,确保中间件在路由之前加载,且type参数匹配请求的Content-Type(支持字符串、正则表达式):

  • 全局配置(所有JSON请求都返回原始Buffer):
    // 匹配带charset后缀的application/json请求
    webhookApp.use(express.raw({ 
      type: /^application\/json/, 
      limit: '1mb' // 根据需求设置请求体大小限制
    }));
    
  • 路由级配置(仅针对特定接口):
    webhookApp.post("/", express.raw({ type: /^application\/json/ }), (req, res) => {
      // req.body 现在是Buffer类型
      const rawJsonString = req.body.toString('utf8');
      // 后续处理逻辑
      res.sendStatus(200);
    });
    

3. TypeScript类型适配

默认Express的Request类型不包含Buffer类型的body,可通过两种方式处理:

  • 全局类型扩展(推荐,所有路由生效):
    declare global {
      namespace Express {
        interface Request {
          body: Buffer;
        }
      }
    }
    
  • 局部类型断言(仅当前路由生效):
    const rawBody = req.body as Buffer;
    

4. 额外排查点

  • 检查是否有第三方中间件(如日志、认证中间件)提前解析了请求体;
  • 确认请求头的Content-Type确实为application/json; charset=utf-8,可通过req.get('content-type')在路由中验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:04:56