개발/TypeScript

🫧TS:: TypeScript + JWT verify 에러(CastError) 해결

hyuunii 2023. 1. 20. 15:42

미치는 줄 알았다.

(ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ)

아니... 아니 토큰 verify해서 잘 깠는데, 

 

 

CastError: Cast to string failed for value "{ userId: ~, iat:~, exp:~} (type Object) at path "userId" for model "Users"

가 나왔다.

"object를 string에다가 갖다주고 같냐고 비교하라고 하면 어떡함?"이라고 말하고 있는데

jwt 핸들링하면서 처음 보는 에러였다. 

그래서 보니까 36line에서 userId를 destructuring 안했길래 그게 문제군. 해서 고치려 했는데

 

 

 

 

property userId가 userId라는 string에 존재하지 않는단다. 

아니... 언제는 userId가 분명 object라며

나보고 어쩌라고?

 

 

 

 

짜증나서 typeof로 userId값을 찍어봤는데 역시나 object

 

 

 

 

근데 또 막상 userId값에 커서 올려보면 string이라고 나온다.

 

 

 

.........?

뭐 어쩌라고

String이야 Object야 하나만 해 미친놈들아

진짜 개빡쳐서 하다가 웨이트했다.... 아오

 

 

 

아무래도 이상했다.

JS에서는 이런 상황을 한번도 마주한적이 없는데

TS로 도입하고 생긴 오류니까.. 아마 jwt 관련해서 import를(특히 payload) 관련해서 덜한게 있다는 직감이 들었다.

 

 

~구글링 구글링 구글링~

스택오버플로우에 비슷한 에러를 만난 사람이 있었고, 그거 보고 해결함.

 

 

방법 정리

1. 임포트 jwt랑 payload type도 같이 해오기.

import jwt from "jsonwebtoken";
import type {JwtPayload} from "jsonwebtoken"

 

2. verify할때 JwtPayload임을 표시해주기

const {userId} = jwt.verify(tokenValue, JWT_SECRET_KEY) as JwtPayload;

 

3. 그러면 위처럼 애가 object인지.. string인지 정신 못차리는것 없이 깔끔하게 object에서 destructuring되어 원하는 값만 뽑을 수 있음