Express URIError:无法解码参数

时间:2018-08-10 12:35:31

标签: node.js express url-encoding next.js

当请求的参数包含%会导致此错误时,我正在将next.js与自定义快递服务器一起使用:

URIError: Failed to decode param '%%faker'
at decodeURIComponent (<anonymous>)
at decode_param (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\layer.js:172:12)
at Layer.match (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\layer.js:148:15)
at matchLayer (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:574:18)
at next (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:220:15)
at middleware (D:\ahmed\coding\react js\with-redux-app\node_modules\http-proxy-middleware\lib\index.js:43:7)
at Layer.handle [as handle_request] (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:317:13)
at D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:284:7
at Function.process_params (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:335:12)
at next (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:275:10)
at expressInit (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\middleware\init.js:40:5)
at Layer.handle [as handle_request] (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:317:13)
at D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:284:7
at Function.process_params (D:\ahmed\coding\react js\with-redux-app\node_modules\express\lib\router\index.js:335:12)

例如,如果请求为http://localhost:3000/summoner/eune/%%faker,则会发生错误,但是如果请求为http://localhost:3000/summoner/eune/^^faker,则^^会被编码,而网址变为http://localhost:3000/summoner/eune/%5E%5Efaker,一切都会正常进行。我可以修复通过遵循以下答案Express handling URIError: Failed to decode param来解决此错误:

server.use((err, req, res, next) => {
  if (err instanceof URIError) {
    err.message = "Failed to decode param: " + req.url;
    err.status = err.statusCode = 400;
    console.log(err);
    return res.redirect(`http://${req.get("Host")}${req.url}`);
    // return app.render(req, res, "/_error");
  }
});

return res.redirect(`http://${req.get("Host")}${req.url}`);这会将用户从http://localhost:3000/summoner/eune/%%faker重定向到http://localhost:3000/summoner/eune/%25%25faker,如果我使用return app.render(req, res, "/_error");,它将把next.js提供的默认错误页面发送回用户,但是这不是我想要的。我想像%一样处理^

所以我的问题是:

  1. 为什么%没有被编码为%25,以及是否有办法实现它?
  2. 谁负责浏览器的编码或表达?
  3. 处理此错误的最佳方法是什么?

我正在使用节点v8.9.1,表示^ 4.16.3。 请详细回答我是一名初学者。 感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:1)

就像您指出的那样,网址是percent-encoded,而http://localhost:3000/summoner/eune/%%faker只是无效的网址。

当您键入无效的url时,大多数浏览器都可以将其更改为有效的值,例如:http://localhost:3000/test test会自动更改为http://localhost:3000/test%20test,但这只是避免出现太多错误的后备方法。

在您的情况下,%不会自动更改为%25,因为浏览器无法知道何时替换%以及何时离开。例如:当您输入%25%25faker时,应按原样使用此URL还是应将其替换为%2525%2525faker

总结:您必须在任何时间使用有效的网址,并且不要依赖浏览器的友好程度。