node.js - Express body-parser 不在多个路由器中间件请求中解析
问题描述
我想从我的路由中的多个中间件访问 req.body 。但我似乎找不到从我的自定义中间件中获取解析的身体数据的方法。
例如:
let mymiddleware = (req, res, next) => {
console.log(req.body); //<- undefined
next();
}
router.post('/', mymiddleware,
multer({fileFilter: filefilter,storage:storage}).any(),//<-this file uploader middleware retrieves req.body without problem.
function (req, res) {
console.log(req.body); //<- parsed body showing here.
});
我错过了什么吗?为什么使用多个中间件时 req.body 不解析?(是的,我相信我已经正确设置了我的正文解析器,因为它在处理程序中工作)
(编辑:关于这个问题的更多细节)
这是我在任何 app.use 路由器之前在 app.js 中的 body-parser 设置:
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
else res.redirect('/');
}
app.use('/console/create_album', ensureAuthenticated, create_album);
我在前端的表格:
<form enctype="multipart/form-data" action='/console/create_album' method='post'>
<!---Just some text inputs, and textarea, file inputs are here -->
</form>
当我不在 router.post 上使用“mymiddleware”中间件时,文件和正文解析的数据可以成功检索,没有问题。
解决方案
您已经为两种数据类型配置了 body-parser,json 和 url-encoded。body-parser 中间件将检查每个传入的请求,并且仅当它是您为其配置的这两种类型之一时才对请求执行任何操作。
但是,当您进行文件上传时,它不是这两种类型之一,因此,正文解析器不会读取和解析它。
multer()
另一方面,中间件期待文件上传的类型,因此它会为您读取、解析和处理正文。
仅供参考,body-parser 文档特别说明了这一点:
这不处理多部分实体,因为它们复杂且通常很大。对于多部分正文,您可能对以下模块感兴趣:
busboy 和 connect-busboy
多方和连接多方
强大
穆尔特
而且,您的表单指定enctype="multipart/form-data"
哪个是多部分的。
推荐阅读
- swiftui - 使用 iOS 14 @main 时托管控制器
- c# - LINQ - 将选择总和转换为分组总和
- python - PyGame:如何对列表中的图像使用“get_rect”函数
- kubernetes - Pulumi pod 未能完全初始化或在 gcp 中生效
- javascript - Javscript vanila 点击事件适用于计算机,但不适用于手机
- html - 如何垂直居中
- html - 如何 - 并排对齐图像
- php - 使用 foreach 循环获取数据并通过 cron 作业发送电子邮件
- python - 无法理解某些一直存在“字符串”语法问题的 python 网络爬虫有什么问题
- python - 尝试使用假日期填充我的模型时出现 FieldError,python