[에러 해결] (function) no longer accepts a callback
679
작성한 질문수 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();
}
답변 2
0
안녕하세요, 인프런 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





