인프런 커뮤니티 질문&답변

ywk0205님의 프로필 이미지

작성한 질문수

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의

노드 리액트 기초 강의 #14 로그아웃 기능

[에러 해결] 콜백 관련 오류 나오시는 분들

24.02.28 23:07 작성

·

365

·

수정됨

2

promise chain 적용하여 코드를 변경했습니다. 참고하시면 좋을 거 같아요!

 

// index.js

app.post('/api/users/logout', auth, (req, res) => {
    User.findOneAndUpdate({
        _id: req.user._id
    }, {
        token: ""
    })
    .then(() => {
        return res.status(200).json({
            logoutSuccess: true
        });
    })
    .catch((err) => {
        return res.status(400).json({
            logoutSuccess: false,
            message: err.message
        });
    })
})


// auth.js

function auth(req, res, next) {
    // 쿠키에서 토큰 가져오기
    const token = req.cookies.x_auth;
    console.log("token is ", token);

    // 토큰 복호화 및 유저 검색
    User.findByToken(token)
    .then((user) => {
        if (!user) {
            throw new Error("유효하지 않은 토큰입니다.");
        }

        // 토큰과 유저정보를 다음 단계로 전달함.
        req.token = token;
        req.user = user;
        return next();
    })
    .catch((err) => {
        return res.status(401).json({
            isAuth: false,
            message: err.message
        });
    })
}


// User.js

userSchema.statics.findByToken = function(token) {
    const user = this;

    return util.promisify(jwt.verify)(token, 'secretToken')
        .then((decoded) => {
            console.log(decoded);
            return user.findOne({
                "_id": decoded,
                "token": token
            });
        })
        .catch((err) => {
            console.log(err);
            throw new Error("유효하지 않은 토큰입니다.");
        });
}

답변 2

0

YOHAN JIN님의 프로필 이미지

2024. 03. 01. 05:59

감사합니다. 나름대로 이렇게 저렇게 해보려고 ㅈㄹ병 하다가 님 코드로 왔네요.

아 이 얕은 지식 어쩔거야...

0

인프런 AI 인턴님의 프로필 이미지

2024. 02. 29. 23:11

안녕하세요, 인프런 AI 인턴입니다.
ywk0205님, 코드를 promise chain으로 변경하셔서 동작하는 부분을 확인해보신 것 같네요. Node.js에서 callback 대신 promise를 사용하면 비동기 작업을 보다 쉽게 관리할 수 있으며, 코드 가독성도 높일 수 있습니다.

제공해주신 코드에서는 User.findOneAndUpdate 함수와 User.findByToken 함수에서 Promise를 반환하여 then과 catch를 통해 결과를 처리하고 계시며, 에러 발생 시 적절한 HTTP 상태 코드와 메시지를 전달하도록 하고 있습니다.

로그아웃 엔드포인트에서 auth 미들웨어를 사용하셔서 유저 인증을 처리하고, 요청이 유효하다면 유저 정보의 토큰을 비워 로그아웃을 진행하고 있네요.

이처럼 Promise 기반으로 코드를 작성할 때에는 에러를 핸들링하는 방법과 함께, 연결된 then 블록 간 데이터를 전달하는 방식에 대해서도 명확하게 이해하고 계시면 좋습니다. 비동기 처리의 흐름을 잘 관리하시면 더욱 견고한 애플리케이션을 만드실 수 있을 거예요.

추가적으로 궁금하신 내용이나 더 자세한 도움이 필요하시면 문의해주시길 바랍니다.

ywk0205님의 프로필 이미지

작성한 질문수

질문하기