Я использую 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
, ^^
кодируется, а URL-адрес становится http://localhost:3000/summoner/eune/%5E%5Efaker
, и все работает отлично. Я могу исправить эту ошибку, выполнив этот ответ Экспресс-обработка URIError: не удалось декодировать параметр следующим образом:
server.use((err, req, res, next) => {
if (err instanceof URIError) {
err.message = "Failed to decode param: " + req.url;
err.status = err.statusCode = 400;
console.info(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. Пожалуйста, опишите подробно, я начинающий разработчик. Спасибо за ваше время.
Как вы указали, URL-адреса - закодированный в процентах, а http://localhost:3000/summoner/eune/%%faker
просто недопустим в качестве URL-адреса.
Когда вы вводите недопустимый URL-адрес, большинство браузеров достаточно любезны, чтобы изменить его на что-то действительное, например: http://localhost:3000/test test
автоматически изменяется на http://localhost:3000/test%20test
, но это просто резерв, чтобы избежать слишком большого количества ошибок.
В вашем случае %
не изменяется автоматически на %25
, потому что браузеры не могут знать, когда заменить %
, а когда оставить. Пример: когда вы вводите %25%25faker
, следует ли использовать этот URL-адрес как есть или его следует заменить на %2525%2525faker
?
В итоге: вы должны использовать действительные URL-адреса в любое время и не полагаться на доброту браузера.