Express urierror: не удалось декодировать параметр

Я использую 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.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
5 385
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы указали, 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-адреса в любое время и не полагаться на доброту браузера.

Другие вопросы по теме