2014-09-30 116 views
9

使用Express的URL参数功能时,似乎参数会自动解码。也就是说,百分比编码的实体被解析为它们的正常形式。 %20被替换为空格。Express URL参数功能不会解码加号(+)作为空格

但是,加号+未被空格替换。这大概是因为Express在内部使用decodeURIComponent(),这也不能代替带空格的+。简单的示例代码:

app.get('/:sourceFile', function (req, res, next) { 
    console.log(req.params.sourceFile); 
}); 

如果要求/test%20test,那么你得到的控制台上test test。如果你要求/test+test,那么你在控制台上得到test+test

有没有办法在Express 4中更改这种操作模式?这是一个错误?

+0

解码目前是(4.9.5)[在router/layer.js中定义](https://github.com/strongloop/express/blob/4.9.5/lib/router/layer.js# L131-L151),如你猜测的那样,使用'decodeURIComponent()',我没有看到任何修改这个行为的选项('decode_param'被定义,并且只在模块范围内作为本地引用)没有PR。 – 2014-09-30 03:22:05

+1

@JonathanLonowski感谢您深入研究。我想我可以用'%20'来创建一些中间件来替换'+',但这有点不方便。 – Brad 2014-09-30 03:23:28

+0

你有没有想出一个解决方案? – loveNoHate 2015-02-06 08:03:08

回答

1

您正试图使用​​+来表示请求的“URI部分”中的空格。你不能那样做。加号仅在查询字符串中被转换为空格。

这不是一个错误。在URI规范中(第12/13页https://tools.ietf.org/html/rfc3986),加号是一个保留字符,不应被翻译为空格。