export function isModeratorOrAdmin (req, res, next) {
    User.findByPk(req.user_id).then(user => {
        user.getRoles().then(roles => {
            for (let i = 0; i < roles.length; i++) {
                if(roles[i].name === "moderator") {
                    next();
                    return;
                }

                if(roles[i].name === "admin") {
                    next();
                    return;
                }
            }

            res.status(403).send({
                message: "관리자 또는 중재자 권한이 필요합니다."
            });
            return;
        });
    })
}

위 예시에서처럼 next(); return; 으로 사용할 때도 있고

export function verifyToken (req, res, next) {
    let token = req.headers["x-access-token"];

    if(!token) {
        return res.status(403).send({
            message: "인증 토큰이 없습니다."
        });
    }

    jwt.verify(token, config.secret, (err, decoded) => {
        if(err) {
            return res.status(401).send({
                message: "권한이 없습니다."
            });
        }
        req.user_id = decoded.id;
        next();
    });
}

이 예시에서 처럼 next()만 쓸 때도  있다.

왜그럴까? 나는 이 이유를 생각하지 않고 코딩을 하다가 문제에 직면했다.

 

next()는 라우터에 연결된 여러 미들웨어들을 연결해주는데

첫번째 미들웨어의 코드들이 다 끝나기도 전에 next()가 실행되면 두번째, 세번째, ... 마지막 미들웨어가 끝난 후에 이 첫번째 미들웨어의 나머지 코드들이 실행된다.

 

이것을 막기위해

next();

return;

또는 

return next()

를 쓰면 되돌아오지 않는다.

 

+ Recent posts