为什么在express.js中没有正确解释重音字母?

时间:2015-07-30 16:31:28

标签: node.js express

我在express中有以下问题,我在包含以下字符的post请求中得到一个字符串 'a e i o u',字符串被正确解释,但添加带符号的百分号('%áéíóú')字母成为问号(' '),是否有任何想法?

这是我的-package.json-:https://gist.github.com/ripper2hl/f05fd6de3b2b218e6d17

这是-index.js-收据请求的地方:https://gist.github.com/ripper2hl/ae6533e14078bc9b0119

iojs v2.2.1 enter image description here

1 个答案:

答案 0 :(得分:1)

在您的示例项目中,您告诉body-parser不要使用扩展查询字符串解析器(here)。

这将使它使用内置的querystring模块来解析查询字符串,这不如用作扩展解析器(qs)的健壮。

您可以通过此PoC查看这两个解析器之间的差异:

var querystring = require('querystring');
var qs          = require('qs');
var input       = 'data=% á é í ó ú';

console.log('querystring:', querystring.parse(input) );
console.log('qs         :', qs.parse(input) );

输出再现您所看到的内容:

querystring: { data: '% � � � � �' }
qs         : { data: '% á é í ó ú' }

最终,它归结为您的输入,这在URL编码方面无效:

  • %具有特殊含义(作为转义字符)
  • 空格应编码
  • 应编码非ASCII字符

有效输入数据如下所示:

data=%25%20%C3%A1%20%C3%A9%20%C3%AD%20%C3%B3%20%C3%BA