Medusa.JS中POST中间件req.body为空的问题求助
以下是排查和解决的几个方向:
检查请求Content-Type头
确保前端请求时设置了正确的Content-Type:如果是JSON数据,必须设为application/json;如果包含文件,用multipart/form-data。Medusa的默认bodyParser只会解析匹配对应Content-Type的请求体,头不匹配的话req.body会是空的。调整中间件执行顺序排查
你当前把authenticateCustomer()放在myTestFunc前面,有可能认证中间件在处理过程中消耗了请求体或者修改了req对象。可以临时把myTestFunc移到认证中间件前面,看看req.body是否有值,以此确认是不是认证中间件的问题。回退依赖版本测试
既然之前能正常运行,现在突然失效,大概率是依赖更新导致的。查看package.json里Medusa及相关依赖(如body-parser、express)的版本,回退到之前正常的版本重新启动服务,验证问题是否消失。直接验证请求有效性
用Postman或curl直接构造请求,确认请求体确实被正确发送:curl -X POST http://你的服务地址/store/carts/测试ID/line-items \ -H "Content-Type: application/json" \ -d '{"quantity": 2, "variant_id": "你的商品变体ID"}'如果这样发送后req.body还是空,问题出在服务端;如果有值,那是前端请求的问题。
检查Medusa的bodyParser自定义配置
虽然Medusa默认启用bodyParser,但项目中可能存在自定义配置覆盖了默认行为。检查medusa-config.js或其他自定义express配置文件,看是否有修改bodyParser的参数,比如限制了请求体大小、禁用了JSON解析等。
你的中间件代码参考:
async function myTestFunc(req: MedusaRequest, res: MedusaResponse, next: MedusaNextFunction) { const logger = req.scope.resolve<Logger>('logger'); console.log("Request BODY!", JSON.stringify(req.body)) console.log("Request PARAMS!", JSON.stringify(req.params)) console.log("Customer ID!", JSON.stringify(req.user?.customer_id)) next(); } export const config: MiddlewaresConfig = { routes: [ { matcher: '/store/carts/:id/line-items', middlewares: [authenticateCustomer(), myTestFunc] } ], };
内容的提问来源于stack exchange,提问作者user2305673

