• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

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

24.02.28 22:07 작성 조회수 127

1

이제는 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();
}

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.29

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

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

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

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

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