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

Express body-parser多路由中间件解析异常:自定义中间件无法获取req.body

问题分析与解决方案

这个问题我之前也碰到过,核心原因是中间件执行顺序和请求体解析的逻辑问题,我来给你拆解下:

为什么mymiddleware里拿不到req.body?

你的自定义中间件mymiddleware被放在了multer中间件的前面,但multer是专门用来解析multipart/form-data类型请求体的工具——而Express默认的express.json()或express.urlencoded()这类中间件是不处理这种请求体的。

也就是说,在multer执行之前,请求体还没有被任何中间件解析,所以req.body自然是undefined;而当multer执行完毕后,它会把表单里的普通字段解析到req.body,文件解析到req.files,这时候后面的路由处理函数才能拿到完整的req.body。

解决方案

根据你的需求,调整中间件的执行顺序即可:

方案1:将自定义中间件放在multer之后

如果你的请求是标准的文件上传请求(multipart/form-data类型),直接把mymiddleware移到multer后面,确保multer先完成请求体解析:

let mymiddleware = (req, res, next) => { 
  console.log(req.body); // 现在能拿到解析后的内容了
  next(); 
} 

// 调整顺序:multer -> 自定义中间件 -> 路由处理函数
router.post('/', multer({fileFilter: filefilter,storage:storage}).any(), mymiddleware, function (req, res) { 
  console.log(req.body); 
});

方案2:如果需要同时处理多种请求体类型

如果你的接口需要同时支持普通JSON请求和文件上传请求,可以先添加对应的解析中间件,再按顺序排列:

// 先添加JSON解析中间件(处理application/json类型请求体)
router.use(express.json());
// 添加urlencoded解析中间件(处理application/x-www-form-urlencoded类型)
router.use(express.urlencoded({ extended: true }));

let mymiddleware = (req, res, next) => { 
  console.log(req.body); // 无论是JSON还是multipart的请求体,都能拿到
  next(); 
} 

// 依然保持multer在自定义中间件前面
router.post('/', multer({fileFilter: filefilter,storage:storage}).any(), mymiddleware, function (req, res) { 
  console.log(req.body); 
});

额外说明

  • multer只会解析multipart/form-data类型的请求体,对于其他类型的请求体,还是需要依赖express.json()或express.urlencoded()来解析。
  • 所有需要访问已解析req.body的中间件,都必须放在对应的解析中间件(multer/express.json()等)之后执行,这是Express中间件“按顺序执行”的特性决定的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:42:49