var bodyParser = require('body-parser'),
require('body-parser-xml')(bodyParser);
function test(req, res) {
console.log(req.body);
res.sendStatus(200);
}
module.exports = {
middleware: [
bodyParser.json(),
bodyParser.text(),
bodyParser.xml({
xmlParseOptions: {
normalize: true,
normalizeTags: true,
explicitArray: true
}
})
],
'/test': [{
get: test
}],
}
在上面的代码中,我试图提取application/xml, text/xml, application/json, text, text.plain, application/x-www-form-urlencoded
。
但是当我使用Error: Non-whitespace before first tag.
标头传递原始正文内容时,我收到错误text/plain
。
如何使用正文解析器中间件来提取上述所有请求正文内容?
答案 0 :(得分:1)
我不认为你做错了什么,对我来说这看起来像个错误。 body-parser-xml
的代码很短,因此找到问题并不困难。
它创建bodyParser.text
的内部实例,type
设置为['*/xml', '+xml']
。到现在为止还挺好。然后,它通过“文本”解析器运行请求,以XML形式读取字符串。如果请求的content-type
为text/plain
(或任何其他非XML类型),则将被忽略。那也没关系。问题是下一步:
if(typeof req.body !== 'string') { return next(); }
它假设如果req.body
是一个字符串,那么它必须来自其内部文本解析器。但这是一个不正确的假设,因为req.body
可能已经是早期中间件的字符串。
我建议您针对body-parser-xml
提交错误。
避免此问题的最简单方法是切换bodyParser.text
和bodyParser.xml
的顺序。