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
相关产品推荐
相关产品推荐

