首页 > 解决方案 > 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”中间件时,文件和正文解析的数据可以成功检索,没有问题。

标签: node.jsexpressbody-parser

解决方案


您已经为两种数据类型配置了 body-parser,json 和 url-encoded。body-parser 中间件将检查每个传入的请求,并且仅当它是您为其配置的这两种类型之一时才对请求执行任何操作。

但是,当您进行文件上传时,它不是这两种类型之一,因此,正文解析器不会读取和解析它。

multer()另一方面,中间件期待文件上传的类型,因此它会为您读取、解析和处理正文。

仅供参考,body-parser 文档特别说明了这一点:

这不处理多部分实体,因为它们复杂且通常很大。对于多部分正文,您可能对以下模块感兴趣:

busboy 和 connect-busboy

多方和连接多方

强大

穆尔特

而且,您的表单指定enctype="multipart/form-data"哪个是多部分的。


推荐阅读