2022.05.30 TIL

Seong Hyeon Kim·2022년 5월 30일
0

TIL

목록 보기
3/31

생각의 차이


jwt 토큰의 관해 설명 잘해주신 벨로그

https://velog.io/@cada/%ED%86%A0%EA%B7%BC-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D%EC%97%90%EC%84%9C-bearer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C


문제내용

router.post("/user", async (req,res)=> {        /// 회원가입 api
    const {nickName, password, passwordConfirm } = req.body;            ///body는 사용자가 직접 입력하는거 (선더 클라이언트에서 바디값 주는거랑 비슷 실제로는 웹사이트에서) /// prars 는 url

    
    const exitUser = await Object.find({  ///exitUser는  중복되는 닉네임이나 이메일 찾기위한 변수
                $or: [{nickName}],      /// $or 는 처음 나왔는데 아마 or 느낌으로 쓴거 같다.
            });
            if(exitUser.length){
                res.status(400).send({
                    errorMessage : "중복된 닉네임 입니다."
                });
                return;
            };


            console.log(password)
            if( password.length<4 ){
                res.status(400).send({
                    errorMessage : "비밀번호가 너무 짧습니다."
                });
                return;
            };

  			      if(password !== passwordConfirm){
                res.status(400).send({
                    errorMessage : "패스워드가 일치하지 않습니다.",
                }); 
                return;     /// 여기서 리턴을 하는 이유는 에러 났으니까 이 다음 코드가 실행되지 않게 하기 위해서
            }

    const createdUsers = await Object.create({ nickName, password, passwordConfirm }); 
    
    res.json({ users: createdUsers });
   
});

회원가입 페이지 만들던중 이러한 형태로 만들었다. 내가 짠 코드대로 라면 닉네임 중복, 비밀번호의 길이, 패스워드 일치 모두 잘 되어야 하는데

이상하게 가운데있는 비밀번호가 너무 짧습니다. 만 제대로 작동을 하질 않았다.


오류

내가 비밀번호를 3자리를 치든 4자리를 치든 전부다 비밀번호가 짧다고 나왔다.

그래서 비밀번호를 입력하는 방식에 문제가 있다고 판단하였고, 결국 이것을 해결하지 못해서

joi 를 사용하는 쪽으로 했지만,

기술매니저님에게 물어본 후 무엇이 원인인지 알 수 있었다.


원인

일단 length 는 숫자형이 아닌 문자형만 가능한다는것을 오늘 처음 알게 되었다.

그래서 내가 숫자를 아무리 많이 쳐도 어차피 인식이 안되니 항상 에러메시지가 나왔던것.

그래서 매니저님이 알려주신 해결책이 tostring() 이었다.

이것은

if (password.length<4 )		/// 잘못된 방법


if( password.toString().length<4 )		///올바른 방법
 

근데 애초부터 숫자형을 못받아서 이렇게 된건데 왜 갑자기 password를 문자형으로 굳이 받으실려는거지?? 라는 생각이 들어서 물어봤더니,

tostring() 을 사용하는 결과값은 실제론 내가 숫자를 치더라도 그 숫자가 문자형이 되어서 나온다.

즉 내가 입력한 숫자는 1234 를 치더라도 실제로는 "1234" 가 되어서 나오게 되는 것이다.

나는 어떻게든 숫자형의 형태로 받을려고만 생각하고 length 를 못쓴다는걸 잊고있엇지만,

tostring() 을 사용함으로써 문자형의 형태가 되고, 그래서 length 도 쓸수 있으니

완벽하게 해결되는 것이다.

실제로
console.log(typeof password.toString())

로 찍어보니 문자형인 string 으로 나온것도 확인할 수 잇었다.



[최종답안]

router.post("/user", async (req,res)=> {        /// 회원가입 api
    const {nickName, password, passwordConfirm } = req.body;            ///body는 사용자가 직접 입력하는거 (선더 클라이언트에서 바디값 주는거랑 비슷 실제로는 웹사이트에서) /// prars 는 url

    
    const exitUser = await Object.find({  ///exitUser는  중복되는 닉네임이나 이메일 찾기위한 변수
                $or: [{nickName}],      /// $or 는 처음 나왔는데 아마 or 느낌으로 쓴거 같다.
            });
            if(exitUser.length){
                res.status(400).send({
                    errorMessage : "중복된 닉네임 입니다."
                });
                return;
            };


             if( password.toString().length<4 ){
                res.status(400).send({
                    errorMessage : "비밀번호가 너무 짧습니다."
                });
                return;
            };

     
            if(password !== passwordConfirm){
                res.status(400).send({
                    errorMessage : "패스워드가 일치하지 않습니다.",
                }); 
                return;     /// 여기서 리턴을 하는 이유는 에러 났으니까 이 다음 코드가 실행되지 않게 하기 위해서
            }

    const createdUsers = await Object.create({ nickName, password, passwordConfirm }); 
    
    res.json({ users: createdUsers });
   
});
profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글