초보 개발자

middleware / edit, change-pw handler (★★★) 본문

RECAP - WETUBE

middleware / edit, change-pw handler (★★★)

taehyeki 2021. 9. 28. 23:54

우리가 로그인이 되어있지 않은 상태로 로그아웃을 하거나 반대로

로그인 되어 있는 상태로 또 다시 로그인을 한다면 안될 것이다.

이런 경우에 middleware를 사용하여 사전에 차단할 수 있다.

 

로그인 되어있는 상태일때만 접근 할 수 있는 forLoggedUser와

로그인 되어있지 않은 상태일때만 접근 할 수 있는 forPublic

이 두개의 middleware를 만들었다.

사용법은 간단하다.

handler앞에 적어주기만 하면 끝이다. route()를 통해 get,post메서드를 같이 받고 있는 상태라면  all()을 사용해 한번에 처리할 수도 있다.

 

다음으로 user edit handler를 만들어 보도록 하겠다.

먼저 router와 handler, 그리고 pug가 필요하다

이렇게 퍼그를 해두고 loggedUser의 정보를 가져와 미리 form에 입력된 상태로 만들어두었다.

이 역시 middleware로 사전에 로그인 되어 있지 않으면 들어오지 않도록 작업을 해두었다.

nomard code에서 숙제가 나왔다. users edit을 해오라는 것이었다.

만약 내 아이디가 m1 이었는데 그대로 m1으로 놔둘 수도 있는 것이고

내 아이디를 m1에서 m2로 바꿀 수 있는 것이다. 이 때 우리가 Unique속성으로 놔 둔 iden과 email은 DB상의 값과 중복된 값이 들어오면 안된다. name등은 중복된 것이 있어도 상관 X

 

그럼 이 때 2가지 차원으로 접근해 볼 수 있을 것 같다.

첫번 째는 req.session.loggedUser에 있는 값과 req.body를통해 바꾸려고 하는 값이 다를 경우에 내가 값을 바꾸었다는 것을 인지할 수 있다. 

 

두번 째는 기존에 req.session.loggedUser에 있는 값은 생각하지 않고 결과적으로 req.body에 있는 값을 통해 내가 값을 바꾸었다는 것을 인지할 수 있는 방법이다. 이 경우에는 id값을 비교하여 기존에 내가 가지고 있던 값인지의 여부를 따져야한다. 이 두가지를 다 해보았는데 둘다 일단 작동은 한다. 

 

첫 번째 방법

기본 적으로 session에 저장해두었던 값과 body의 값을 비교하여 바뀌었다면 수정을 한 상태이고 if문 안으로 들어가게 된다. if안에서 email값이 기존 DB에 저장되어있는지를 확인해야한다. 여기서 req.body에 있는 email값을 써야한다. 

만약 DB상에 존재한다면 EMAIL이 존재한다는 말을 써주자 ( has already been taken을 잘못 적었다. )

이 와 같은 상태로 iden도 똑같이 해주자 이 두개의 if문을 통과 한다면 1. 값이 안바뀌거나 2.  값이 바뀌었어도 기존에 중복된 값이 없는 경우이다. 

 

두 번째 

이 방법은 body에 있는 값들이 기존 DB에 존재하는지 확인을 한다. 만약 exist들이 없는 상태라면 그냥 값을 바꿔줘도 된다.

하지만 값이 DB에 존재할 수도 있다. 그리고 값을 수정하지 않은 상태라면 무조건 exist는 존재할 것이다.

이 경우를 생각해야 하는데 Exist는 있지만 session.loggedUser._id와 exist.id가 같은 상태라면 값을 수정하지 않은 경우이다. 이 경우에는 if문을 빠져나가고 만약 id가 다른경우 라면 기존DB의 값과 겹친다는 이야기이니까 errMessage를 보여주고 연결을 끊는다.  


find로가져온 user나 video는 .id로 접근가능한데
req.session.user 에 집어 넣은건 애초에 있던 이름 전부 _id 다적어야함

 

status등 아직 미완성 되기는 했지만 일단 작동은 잘 되는 것 같다.

다른 사람들이 적은 코드를 봤는데 나와 다른 부분이 많아가지고 .. 뭔가 빠트린 건가?? 이상한 부분있으면 코멘트 대환영입니다!!

 

기본적으로 findeByIdAndUpdate는 update되기전의 데이터를 return해주고 옵션에서 new:true로 설정해주면 업데이트 된 데이터를 return해준다 !! update된 값을 return받아서 req.session.loggedUser에 넣어 업데이트 해주자!! 

그렇지 않으면 DB상에는 업데이트가 되었지만 세션상에는 구 버전이므로 edit에 들어가면 바꾸기 전의 정보가 나올 것이다.

 

다음으로 비밀번호를 바꿔보겠다.

change-pw.pug

chang-pw router

.

getPW, postPW

req.body를 통하여 기존 비밀번호 , 바꿀 비밀번호, 바꿀 비밀번호 확인 3개를 받아온다

먼저 기존 비밀번호와 DB상 저장되어있는 해쉬된 비밀번호를 bcrypt.compare로 비교한 뒤

같다면 그 다음으로 넘어간다. 바꿀 비밀번호와 비밀번호 확인이 다른지 확인하고 같다면 넘어간다.

여기서 findByIdAndUpdate를 활용한다면 전에 User model에서 설정해두었던 pre('save',~)가 실행이안되기 때문에 

mongoDB에 저장이 hash가 되어지지 않은 값으로 저장이 된다.

 

만약 여기서 로그아웃을 해주지 않는다면 req.session.loggedUser = user로 바꾸어주어야한다.

mongoDB는 업데이트 되어있는데 세션에 있는 정보는 update되어있지 않기 때문이다.

 

'RECAP - WETUBE' 카테고리의 다른 글

Model populate, bug fix ( ★★★ )  (0) 2021.09.30
avatar , video upload (multer, static)  (0) 2021.09.29
Github Login - oAuth 2  (0) 2021.09.28
Github Login - oAuth  (0) 2021.09.27
session의 옵션들(resave, saveUninitialized)과 dotenv  (0) 2021.09.27