我使用快速4与身体解析器如此
var bodyParser = require('body-parser');
...
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
当我添加dicer时,它就像身体解析器停止工作一样。我在req.params
或req.body
或req.query
中不再拥有任何邮件参数。
有没有办法手动使用身体解析器? body解析器是否检查多部分表单数据并且什么也不做......假设另一个lib将处理它?</ p>
此外,我觉得我应该注意,我使用dicer解析多部分表单数据是有原因的,如果可能的话,我不想使用busboy或multer或xyz。
答案 0 :(得分:0)
回答你的问题“有没有办法手动使用身体解析器?” 答案是肯定的,这是推荐使用它的方式。参考body-parser documentation:
表达特定路线
此示例演示了如何将body解析器专门添加到需要它们的路由中。一般来说,这是使用body-body的最佳推荐方法。
(我添加了一些分号因为他们会让我晚上起来)
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
// create application/json parser
var jsonParser = bodyParser.json();
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false });
// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
res.send('welcome, ' + req.body.username);
})
// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
// create user in req.body
})
因此,根据您需要身体解析器的路径,您可以使用一些自定义中间件来实现它。现在,我还没有测试过这个,但我假设您也可以像其他快速中间件一样实现它:
// URL encoded bodies
app.use('/api/url/encoded/endpoint', bodyParser.urlencoded({ extended: false }));
// JSON encoded bodies
app.use('/api/json/encoded/endpoint', bodyParser.json());
与上述端点匹配的任何路由,例如
app.use('/api/url/encoded/endpoint/test', function (req, res) { ... });
将使用适当的中间件进行解析,只要它们低于代码中的中间件声明即可。
为了尝试回答你的整个问题,我会说尝试不使用全局解析器是安全的。保持你的解析器api端点特定,你不应该遇到任何问题。
修改强>
所以你的问题有点不清楚。您想将body解析器用于multipart / form-data? “身体解析器由于其复杂且通常较大的性质而无法处理多部分体。”同样,我没有尝试过,但如果是这样的话,也许你可以试试bodyParser.raw({ type: ... })
函数。如果没有,那么您需要在自定义中间件功能中使用dicer,在其中检查正确的内容类型。