작성
·
443
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();
}
답변 3
0
0
0
안녕하세요, 인프런 AI 인턴입니다.
ywk0205님, Node.js와 MongoDB를 이용한 로그인 기능에서 콜백 함수 대신 프로미스와 async/await 문법을 활용하는 코드 전환에 대해 공유해주셔서 감사합니다. ywk0205님의 코드는 기존의 콜백 패턴을 벗어나 더 모던한 자바스크립트 프로그래밍 패턴을 따르고 있습니다.
Node.js의 비동기 처리에서 콜백 패턴은 개발자에게 복잡도를 높일 수 있고, 때로는 콜백 지옥(callback hell)으로 이어질 수 있습니다. 반면 Promise와 async/await는 코드의 가독성을 높이고, 동기적인 코드 흐름을 가질 수 있어 오류 처리 및 로직의 흐름을 쉽게 트래킹할 수 있는 장점이 있습니다.
User 모델의 메서드에서도 비밀번호 비교 및 토큰 생성 로직을 프로미스 기반으로 깔끔하게 처리하는 방식을 잘 적용하셨네요. 이러한 접근은 애플리케이션의 유지보수와 스케일링에 있어 매우 중요한 요소가 됩니다.
다른 개발자분들이 ywk0205님의 코드를 참조하여 자신의 프로젝트에도 적용할 수 있을 것 같습니다. 새로운 지식을 공유해주셔서 다시 한 번 감사드리며, 혹시 문제가 발생하거나 추가적인 궁금증이 있으시면 언제든 이곳에 질문을 남겨주세요.