inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

노드 리액트 기초 강의 #12 토큰 생성 with jsonwebtoken

[에러 해결] (function) no longer accepts a callback

679

ywk0205

작성한 질문수 4

4

이제는 promise chain이나 async await 문으로 콜백함수를 처리해야 하는 것으로 보입니다. 다음과 같이 코드를 수정해서 돌아가는 것을 확인했으니 활용하시면 좋을 것 같아요!

 

// index.js

app.post('/login', (req, res) => {
    // 이메일이 DB에 있는지 확인
    User.findOne({
        email: req.body.email
    })
    .then (async (user) => {
        if (!user) {
            throw new Error("제공된 이메일에 해당하는 유저가 없습니다.")
        }
        // 비밀번호가 일치하는지 확인
        const isMatch = await user.comparePassword(req.body.password);
        return { isMatch, user };
    })
    .then(({ isMatch, user }) => {
        console.log(isMatch);
        if (!isMatch) {
            throw new Error("비밀번호가 틀렸습니다.")
        }
        // 로그인 완료
        return user.generateToken();
    })
    .then ((user) => {
        // 토큰 저장 (쿠키, localstorage ...)
        return res.cookie("x_auth", user.token)
        .status(200)
        .json({
            loginSuccess: true,
            userId: user._id
        });
    })
    .catch ((err) => {
        console.log(err);
        return res.status(400).json({
            loginSuccess: false,
            message: err.message
        });
    })
});


// User.js

userSchema.pre('save', function( next ) {
    // 비밀번호 암호화
    const user = this;

    if(user.isModified('password')) {
        bcrypt.genSalt(10, function(err, salt) {
            if (err) {
                return next(err);
            }

            bcrypt.hash(user.password, salt, function(err, hash) {
                if (err) {
                    return next(err);
                }
                user.password = hash;
                return next();
            });
        });
    }
    else {
        return next();
    }
});

userSchema.methods.comparePassword = function(plainPassword) {
    // 암호화된 비밀번호와 같은지 체크
    const user = this;
    return bcrypt.compare(plainPassword, this.password)
}

userSchema.methods.generateToken = function() {
    // jwt 생성
    user = this;
    const token = jwt.sign(user._id.toJSON(), 'secretToken');
    user.token = token;

    return user.save();
}

react node.js

답변 2

0

doc9733

감사합니다!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

ywk0205님, Node.js와 MongoDB를 이용한 로그인 기능에서 콜백 함수 대신 프로미스와 async/await 문법을 활용하는 코드 전환에 대해 공유해주셔서 감사합니다. ywk0205님의 코드는 기존의 콜백 패턴을 벗어나 더 모던한 자바스크립트 프로그래밍 패턴을 따르고 있습니다.

Node.js의 비동기 처리에서 콜백 패턴은 개발자에게 복잡도를 높일 수 있고, 때로는 콜백 지옥(callback hell)으로 이어질 수 있습니다. 반면 Promise와 async/await는 코드의 가독성을 높이고, 동기적인 코드 흐름을 가질 수 있어 오류 처리 및 로직의 흐름을 쉽게 트래킹할 수 있는 장점이 있습니다.

User 모델의 메서드에서도 비밀번호 비교 및 토큰 생성 로직을 프로미스 기반으로 깔끔하게 처리하는 방식을 잘 적용하셨네요. 이러한 접근은 애플리케이션의 유지보수와 스케일링에 있어 매우 중요한 요소가 됩니다.

다른 개발자분들이 ywk0205님의 코드를 참조하여 자신의 프로젝트에도 적용할 수 있을 것 같습니다. 새로운 지식을 공유해주셔서 다시 한 번 감사드리며, 혹시 문제가 발생하거나 추가적인 궁금증이 있으시면 언제든 이곳에 질문을 남겨주세요.

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

0

36

1

404 에러

0

103

1

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

0

121

1

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

0

240

0

로그아웃 findOneAndUpdate 함수

0

171

1

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

0

195

1

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

0

1931

4

포스트맨에서 true가 안떠요

0

151

1

왜 안되나요

0

130

1

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

0

243

1

로그아웃 401 에러(Unauthorized)

0

506

2

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

0

151

1

7강중에서

0

167

2

User.findByToken is not a function

0

212

1

루트 디렉토리

0

272

1

useState

0

562

1

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

5

876

6

webpack 관련 에러 질문

0

220

1

리액트 관련 질문

0

273

1

14강 로그아웃 안됨

0

319

1

mongoDB 데이터 확인하는 법

0

411

1

postman 에러

0

293

1

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

0

235

1

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

0

274

1