1. Edit Profile
- router나 controller쪽은 이제 이해했으므로 제외
- locals를 배웠을때를 떠올려봐야함
- 우리는 saveUninitialized=false로 했기에 session에 변경점이 있어야 cookie가 생성됨
- 현재 계정정보를 변경하려는 상태이기에 우리는 이미 로그인을 한 상태
- localsMiddleware를 통해 locals object에는 로그인한 user 정보가 들어가있음
- 굳이 controller을 통해 로그인한 user 정보를 보낼 필요가 없다는 것
- template에서도 locals를 사용할 수 있음
- locals는 자동적으로 views에 import됨
- 여기서 문제점은 로그인하지 않은 user가 url을 강제로 입력하여 들어올 경우가 있음
- 따로 처리하는 과정이 없다면 loggedIn=false이기에 에러가 발생
- 즉 애초에 로그인하지 않은 유저가, /users/edit에 접근하지 못하게 redirect해줘야 함
- 그럴때 사용가능한 middleware가 있으면 좋으니 밑에서 다뤄볼 예정
2. Protector and Public Middleware
- router에서 각각 middleware를 사용해도 되지만 express에서 제공하는 all을 사용하여 간략화함
- 테스트해보면 로그아웃한 상태에서 /users/edit으로 강제로 이동해도 /login으로 잘 redirect됨
- 하지만 로그인한 상태에서 /login으로 강제로 이동은 되지만 여기서 github 로그인을 시도 할 경우 홈으로 redirect됨
- 완벽하지 않으므로, userRouter에서 했던 방식으로 rootRouter도 url들을 구별해서 보호하면 됨
- 다시 로그인한 상태에서 /login으로 이동하면, 아까와 다르게 바로 홈으로 redirect됨
- /join으로 가도 역시 로그인한 상태이므 홈으로 이동
- videoRouter는 시청은 아무렇게나 가능하지만, 영상을 upload하고 edit하고, delete할 경우는 로그인한 상태여야 하기 때문
- 정확히 표현하면 Video와 User Model을 연결해야 하기 때문
3. postEdit (1)
- 로그인한 user의 id를 requset object에서 가져오는데, 또 다시 생각을 되짚어보면 로그인을 할때 req.session.user = user를 하였음
- 헷갈리는 사람들이 많기 때문에 반복해서 작성중임
- 이렇게 사용해도 되지만 좀더 스마트한 방법이 있음
- 1번 코드처럼 해도 전혀 상관없지만, 2번 코드처럼 하면 훨씬 더 혼합하기 좋음
- 또한 2번 코드를 사용하면 object를 이해하기 훨씬 좋다고 생각함
- 이 것이 바로 ES6
- 잊지 말아야 할 것은, email username, name, location의 경우 form에서 온다는 것
- input에 name을 빠뜨리면 안된다는 것을 또 또 또 강조
- 이제 user 정보를 수정하면 에러없이 잘 되는것 같지만 다시 edit-profile로 와도 수정되기 전 정보가 input에 표시됨
- 하지만 db를 확인해보면 정보가 수정되있음
- 생각해보면 edit-profile에서 loggedInUser의 값을 입력했는데, loggedInUser가 언제 생성됐는지를 생각해봐야함
- loggedInUser는 localsMiddleware에서 생성되는데 우린 res.locals.loggedInUser = req.session.user라고 정의하고 있음
- 그렇다면 req.session.user가 어디서 생성되는지를 생각해야함
- 바로 로그인할 때 req.session.user = user를 정의하는데 user는 update됐지만 session이 update되지 않음
- db에서는 user정보를 수정했지만 session은 db와 연결되어있지 않기 때문
4. postEdit (2)
- db에서의 update가 프론트엔드에 반영되지 않는데, 현재 session은 로그인 할 때 한 번만 작성되고 있음
- 즉 session을 update하면 되는데 두가지 방법이 있음
- 당연스럽게도 직접 session을 update하는 방법
- 이렇게만 하면 되는게 아니고 schema에 정의한 다른 것도 모두 수정되야함
- ...은 req.session.user안에 있는 내용을 전해주는 것
- req.session.user안의 내용을 밖으로 꺼내주는 것
- ...이 제일 앞에 있어야 하며, ...req.session.user에 있는 email, username, name, location을 덮어씀
- 여기까지가 직접 수정하는 방법
- 두번째 방법을 사용했지만 이 것만으로는 새로운 updateUser가 만들어지지 않음
- https://mongoosejs.com/docs/tutorials/findoneandupdate.html
- mongoose API에서 findByIdAndUpdate에 가보면 option에 보낼 수 있는 object가 있다는걸 알 수 있음
- new라는 option이 있는데 기본적으로 update되기 전 문서를 return한다고 되어 있음
- default는 false인데 new: true를 하게 되면 update된 이후 문서를 return한다고 함
- 직접 update하는 것보다 훨씬 좋음
- 새로고침하고 확인해보니 잘되지만 당연하게도 문제가 있음
- 우리는 schema에 unique로 명시한 것들이 존재하기 때문
- https://github.com/Daniel-Jeon/wetube-loaded/commit/62dbaa041565d4e923f59aa0d4996a434cb3971b
- 메모해두고 나중에 수정
'개발 > Node.js' 카테고리의 다른 글
File Upload (0) | 2024.11.13 |
---|---|
Edit Password (0) | 2024.11.13 |
Github Login Recap again again (0) | 2024.11.13 |
Github Login / Logout (0) | 2024.11.13 |
Github Login / Fetch / API (0) | 2024.11.12 |