错误:第一个标记之前的非空格。在node.js body-parser中

时间:2017-10-21 17:54:20

标签: node.js express body-parser

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

如何使用正文解析器中间件来提取上述所有请求正文内容?

1 个答案:

答案 0 :(得分:1)

我不认为你做错了什么,对我来说这看起来像个错误。 body-parser-xml的代码很短,因此找到问题并不困难。

它创建bodyParser.text的内部实例,type设置为['*/xml', '+xml']。到现在为止还挺好。然后,它通过“文本”解析器运行请求,以XML形式读取字符串。如果请求的content-typetext/plain(或任何其他非XML类型),则将被忽略。那也没关系。问题是下一步:

https://github.com/fiznool/body-parser-xml/blob/3cf7784d6fae61d1d877da54ca56f31b2642975c/index.js#L27

if(typeof req.body !== 'string') { return next(); }

它假设如果req.body是一个字符串,那么它必须来自其内部文本解析器。但这是一个不正确的假设,因为req.body可能已经是早期中间件的字符串。

我建议您针对body-parser-xml提交错误。

避免此问题的最简单方法是切换bodyParser.textbodyParser.xml的顺序。