inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

523

ywk0205

작성한 질문수 4

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("유효하지 않은 토큰입니다.");
        });
}

react node.js

답변 2

0

YOHAN JIN

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

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

0

인프런 AI 인턴

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

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

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

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

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

깃 이메일이랑 비번이 필요하다고 하네요

0

33

1

404 에러

0

101

1

34강 인증 체크에서 element 사용 때문에 에러나시는 분들 이렇게 하심 됩니다.

0

118

1

로그인, 로그아웃, 토근 작동 안 함

0

237

0

로그아웃 findOneAndUpdate 함수

0

170

1

9강 오류 어떻게 해결하나요?

0

193

1

localhost 에서 연결을 거부했습니다.

0

1921

4

포스트맨에서 true가 안떠요

0

150

1

왜 안되나요

0

128

1

몽고db 연결 오류가 납니다 위에껀 입력한 코드, 아래껀 터미널이에요

0

242

1

로그아웃 401 에러(Unauthorized)

0

502

2

암호가 해싱되지 않고 입력값 그대로 db에 저장되는 문제

0

148

1

7강중에서

0

162

2

User.findByToken is not a function

0

210

1

루트 디렉토리

0

268

1

useState

0

560

1

프록시 잘 설정했는데도 404 오류 뜨는 분들

5

874

6

webpack 관련 에러 질문

0

218

1

리액트 관련 질문

0

271

1

14강 로그아웃 안됨

0

316

1

mongoDB 데이터 확인하는 법

0

407

1

postman 에러

0

290

1

선생님 리덕스를 사용하면 어떠한 부분이 좋은지 알 수 있을까요?

0

232

1

다음과 같은 에러들이 발생합니다.

0

271

1