
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 v8.8.0: Mongoose Tutorials: How to Use `findOneAndUpdate()` in Mongoose
The findOneAndUpdate() function in Mongoose has a wide variety of use cases. You should use save() to update documents where possible, for better validation and middleware support. However, there are some cases where you need to use findOneAndUpdate(). In
mongoosejs.com
- 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
edit user profile ! · Daniel-Jeon/wetube-loaded@62dbaa0
awesome
github.com
- 메모해두고 나중에 수정
'개발 > 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 |