<PassportJS> express-session2

김민석·2021년 1월 19일
0

YouTube clone

목록 보기
39/54

이 글은 로그인 기능 구현글을 읽은 뒤에 읽으면 좋습니다.

상황

이때까지 저는 현재 로그인한 유저를 session에 저장하는 걸 passport에게 전적으로 맡겼습니다. 또한 middleware를 통해 현재 로그인한 유저에 대한 정보(deserialize된 정보)를 loggedUser라는 변수명으로 저장해서 template에서 사용했었습니다. 그러다가 발생한 문제가 유저가 자신의 정보를 업데이트하는 경우 loggedUser에 반영이 안되는 문제가 발생했습니다.

문제

loggedUser는 session에 저장된 id를 이용해 deserialize한 정보인데 이 deserialize한 정보가 로그인한 순간에 db에서 정보를 받아와 저장하고 있기 때문에 유저가 업데이트 한 정보가 loggedUser가 반영될 수 없었습니다.

해결

해결방법으로 유저를 로그아웃시킨 후에 재 로그인 시키는 방법을 사용했습니다.

project

youtube
  |controllers
   *|userController.js

userController.js

  • req.logout()
    먼저 유저를 로그아웃 시킵니다.
  • req.login(User user, cb)
    업데이트한 유저를 새로 불러와서 로그인시켜줍니다. 콜백함수는 꼭 넣어주어야합니다. 넣지 않으면 에러가 발생합니다.
export const postEditProfile = async (req, res) => {
  const {
    user:{
      _id:id
    },
    body:{
      name
    }
  } = req;

  try{
    await User.findByIdAndUpdate(id, {
      name,
      avatarUrl: req.file? req.file.path : req.user.avatarUrl
    });
    const user = await User.findById(id);
    req.logout();
    req.login(user, function(err){
      console.log(err);
    });
    res.redirect(`/users/${routes.userDetail(user.id)}`);
  }catch(e){
    console.log(e);
    res.redirect(routes.home);
  }
}
profile
누구나 실수 할 수 있다고 생각합니다. 다만 저는 같은 실수를 반복하는 사람이 되고 싶지 않습니다. 같은 실수를 반복하지 않기 위해 기록하여 기억합니다.🙃

0개의 댓글