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

如何在express.urlencoded解析后保留request.body的原始文本?

在express.urlencoded解析后保留原始请求体的方法

要保留原始请求体,你需要在express.urlencoded中间件之前添加自定义中间件,先捕获请求流的原始数据并挂载到req对象上,之后再让express.urlencoded将请求体解析为对象。

具体实现步骤:

  • 先注册前置中间件,收集原始请求文本:

    // 捕获原始请求体的中间件
    app.use((req, res, next) => {
      let rawBody = '';
      // 监听请求数据事件,拼接数据片段
      req.on('data', (chunk) => {
        rawBody += chunk;
      });
      // 请求结束后,将原始文本挂载到req.rawBody
      req.on('end', () => {
        req.rawBody = rawBody;
        next(); // 继续执行后续中间件
      });
    });
    
  • 再注册express.urlencoded中间件完成解析:

    app.use(express.urlencoded({ extended: true }));
    

之后在路由处理函数中,就能同时访问解析后的对象req.body和原始请求文本req.rawBody:

app.post('/demo', (req, res) => {
  console.log('解析后的请求体对象:', req.body);
  console.log('原始请求文本:', req.rawBody);
  res.send('请求已处理');
});

注意事项

  • 该方案仅适配application/x-www-form-urlencoded类型的请求,与express.urlencoded的处理范围一致。
  • 若请求体体积较大,建议用Buffer拼接代替字符串拼接,避免内存溢出:
    app.use((req, res, next) => {
      const chunks = [];
      req.on('data', (chunk) => chunks.push(chunk));
      req.on('end', () => {
        req.rawBody = Buffer.concat(chunks).toString();
        next();
      });
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:45:32