当请求的参数包含%
会导致此错误时,我正在将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提供的默认错误页面发送回用户,但是这不是我想要的。我想像%
一样处理^
。
所以我的问题是:
%
没有被编码为%25
,以及是否有办法实现它?我正在使用节点v8.9.1,表示^ 4.16.3。 请详细回答我是一名初学者。 感谢您的宝贵时间。
答案 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
?
总结:您必须在任何时间使用有效的网址,并且不要依赖浏览器的友好程度。