[Node.js] 로그인 정보 받아오지 못할 때 문제 해결

소영·2023년 1월 10일

node.js와 mongoDB를 이용해서 간단한 홈페이지를 만들고 있던 도중, 로그인 상태를 확인하기 위해 한참을 고민한 끝에 미들웨어를 이용해 해결했다.

그런데,

controllers/user.js

/* 생략 */
} else if (await bcrypt.compare(userpw, user.userpw)) {
	req.session.user = {
    	userid: userid,
        username: user.username
    }
    res.render('main', {
    	userid: req.session.user.userid,
        username: req.session.user.username,
        isLogin: true
    });
}
/* 생략 */

middleware/loginCheck.js

function loginCheck(req, res, next) {
	if (req.session.user) {
    	next();
    } else {
    	res.render("main", { isLogin: false });
    }
}

module.exports = { loginCheck }

routes/index.js

/* 생략 */
router.get('/', loginCheck, function(req, res) {
	res.render('main');
});
/* 생략 */

이렇게 코드를 작성하고 로그인을 해보면 메인화면은 잘 변경되서 나오지만 두가지 문제가 발생한다.

첫번째로는, 주소창이
localhost:3000/ ➡️ 다음과 같이 나와야하는 주소창이
localhost:3000/signin/signin ➡️ 이렇게 나오는 것이다.

두번째는, 로그인이 되어있는 상태에서 로고 (onclick="location.href='/'")를 누를 경우 isLogin 및 모든 정보가 undifined 되며 아무 정보를 받아오지 못하는 것이다.

코드가 실행되는 순서대로 다시 자세히 살펴보니
로그인할 시 정보는 잘 넘어가지만, 로고의 클릭 이벤트 자체는 / 이 루트 주소로 되어 있기 때문에

routes/index.js

/* 생략 */
router.get('/', loginCheck, function(req, res) {
	res.render('main', {
    	userid: req.session.user.userid,
        username: req.session.user.username,
        isLogin: true
    });
});
/* 생략 */

로그인 컨트롤러와 마찬가지로 기본 상태에도 세션에 대한 정보 및 로그인 정보를 넣어야 하는 것이였다!
여기다 로그인 상태를 넣어도 상관없는 이유는 loginCheck라는 미들웨어에서 검사를 해주기 때문에 로그인이 되어있는 상태에서 로고를 몇 번이고 눌러도 isLogin은 false라는 값만 내보낸 채 로그인이 되지 않았다고 인식한다.


===> 미들웨어의 중요성!!!

0개의 댓글