Request path contains unescaped characters 해결방법 - 한글URL 인코딩 오류

YLYLYL·2023년 3월 6일
0

상황

[이름검색]
param에 찾고싶은 이름을 작성하면 해당 이름을 가진 데이터를 찾아오는 코드를 작성하려고한다.
다만, 다른 서버가 해당 데이터를 가지고 있어서, axios로 연결하여 가져오려고 한다.

router.get(
  `/search/:name`,
  [
    check('name')
      .exists({ checkFalsy: true, checkNull: true })
      .isString()
      .trim()
  ],
  (req, res) => {
    // ...생략
    return controller.getDocByName(req, res);
  }
);
exports.getDocByName =async (req, res) => {
    const { name } = req.params;
    const result = await axios.post(`${process.env.URI}/internal/${name}`);
	// ...  
}

문제발생


Request path contains unescaped characters 라는 에러가 발생했다.

찾아보니, url경로에 인코딩 되지 않은 문자인 한글이 포함되서 발생는 오류이다.
(공백, 특수문자 혹은 UTF-8로 인코딩 되지 않은 문자...)

그래서 name param에 한글을 넣는 순간 위와 같은 에러가 발생하는거..오키 이해완료! 그저 인코딩, 디코딩만 해주면 된다.

보내는 쪽에서

const name = encodeURI(req.params.name);

받는 쪽에서

let name = decodeURI(req.params.name) || '';

console로 찍어보니 아래처럼 인코딩 된 문자로 넘어가서 에러없이 잘 응답한다!

그런데

그런데, 해결 하기 전 다른 서버에서 테스트를 해보았다.
한글 인코딩,디코딩이 평소에 자주 만났던 문제는 아닌것 같았는데...?

const router = express.Router();

router.get("/:id", async (req: express.Request, res: express.Response) => {
  const id = req.params.id;

  res.status(200).json(id);
});

대충 서버 하나 띄워서 위와 같은 라우터를 생성했다.

음 123은 당연히 잘 뜨지.

한글을 입력한다면? url에 인코딩처리 하지 않은 문자가 들어가니 오류가 뜨나?

아니. 한글이 너무 잘 출력된다

왜인가 찾아보니

Express.js의 router.get 메서드를 사용할 때는 URL 경로가 라우터에 의해 자동으로 인코딩되므로 이와 같은 오류가 발생하지 않습니다.

아하....!!! 알아갑니다..

0개의 댓글