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

NodeJS Express中在index.js提前提取req.body的问题

解决Node.js API中index.js无法获取req.body的问题

核心原因

你在index.js中自定义的中间件执行顺序早于请求体解析中间件(比如express.json()),此时请求体还未被解析,所以req.body返回undefined;而stripeController.js对应的路由挂载在解析中间件之后,因此能正常获取请求体。

具体修复步骤

  1. 调整中间件加载顺序
    必须保证请求体解析中间件(express.json()或express.urlencoded())在你自定义的中间件之前挂载。示例代码:

    const express = require('express');
    const app = express();
    const stripeController = require('./Controllers/stripeController');
    
    // 优先挂载请求体解析中间件
    app.use(express.json()); // 解析JSON格式请求体
    app.use(express.urlencoded({ extended: true })); // 解析表单格式请求体(按需使用)
    
    // 再挂载自定义中间件,此时已能获取req.body
    app.use((req, res, next) => {
      console.log('index.js中获取的请求体:', req.body);
      next(); // 传递请求到后续环节
    });
    
    // 最后挂载路由与控制器
    app.post('/stripe-webhook', stripeController.handleWebhook);
    
  2. 避免重复挂载解析中间件
    如果stripeController.js所在的路由文件中单独挂载了解析中间件,会导致index.js的中间件执行时请求体还未被处理。这种情况下,统一将解析中间件放在index.js最前端即可,无需重复挂载。

  3. 流式请求体特殊处理(如Stripe Webhook)
    若处理的是Stripe Webhook这类需要读取原始流式请求体的场景,不能直接用express.json()解析,需先读取原始流再转换:

    // 针对Stripe Webhook路由,使用raw中间件获取原始Buffer
    app.use('/stripe-webhook', express.raw({ type: 'application/json' }));
    
    // 自定义中间件解析原始体
    app.use('/stripe-webhook', (req, res, next) => {
      req.body = JSON.parse(req.body.toString());
      console.log('index.js中获取的Stripe请求体:', req.body);
      next();
    });
    
    app.post('/stripe-webhook', stripeController.handleWebhook);
    

验证方式

启动服务后发送测试请求,查看index.js中自定义中间件的日志输出,确认req.body已正常返回内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:45:00