NodeJS Express中在index.js提前提取req.body的问题
解决Node.js API中index.js无法获取req.body的问题
核心原因
你在index.js中自定义的中间件执行顺序早于请求体解析中间件(比如express.json()),此时请求体还未被解析,所以req.body返回undefined;而stripeController.js对应的路由挂载在解析中间件之后,因此能正常获取请求体。
具体修复步骤
调整中间件加载顺序
必须保证请求体解析中间件(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);避免重复挂载解析中间件
如果stripeController.js所在的路由文件中单独挂载了解析中间件,会导致index.js的中间件执行时请求体还未被处理。这种情况下,统一将解析中间件放在index.js最前端即可,无需重复挂载。流式请求体特殊处理(如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
相关产品推荐
相关产品推荐

