表示身体解析器未在多个路由器中间件请求中解析

时间:2018-05-07 02:20:42

标签: 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中的身体解析器设置:

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'中间件时,成功检索到文件和正文解析数据没有问题。

3 个答案:

答案 0 :(得分:1)

您已为两种数据类型json和url-encoded配置了body-parser。正文解析器中间件将检查每个传入请求,并且只对请求执行任何操作(如果它是您为其配置的两种类型之一)。

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

另一方面,multer()中间件期望文件上传的类型,以便它为您读取,解析和处理正文。

仅供参考,body-parser doc具体说明了这一点:

  

由于它们复杂且通常较大,因此不能处理多部分主体。对于多部分机构,您可能对以下模块感兴趣:

     

busboy和connect-busboy

     

multiparty和connect-multiparty

     

强大

     

multer

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

答案 1 :(得分:0)

您需要初始化body解析器。请参阅https://www.npmjs.com/package/body-parser并查看他们的示例。

编辑: Multer在指定路径的服务器中存储文件。然后,您必须使用fs来检索文件。对于multer,您需要以&#39; form-data&#39;的形式发送数据。而不是urlencoded或json。所以bodyparser无法检测到这些。如果数据以urlencoded和json的形式发送,您可以像在exmaple中一样配置bodyparser并访问req.body。

答案 2 :(得分:0)

将您的代码更改为:

router.post('/',
    multer({fileFilter: filefilter,storage:storage}).any(),
    mymiddleware,
    function (req, res) {
        console.log(req.body); //<- parsed body showing here.
    });

请注意节点路由将按定义的时间顺序执行。因此,要访问req.body解析器必须首先定义。