작성
·
204
0
안녕하세요! 강의 너무 잘듣고있습니다. 진행중에 막히는 부분이 생겨 질문드립니다.
generateToken을 할때 token을 만들어주고 model 단에서 user.save()를 통해 token을 저장한다고 알고있습니다.
그런데 save() 함수에 들어간 후 부터 response가 오지 않고, 에러도 뜨지 않으며 sending request 에서 멈추는 현상이 있습니다.
1. save 함수 이전까지 console로 찍어서 동작이 되는걸 확인하였습니다. 코드가 같은데 왜 이런현상이 일어나는지 잘 모르겠습니다 ㅠㅠ 제 생각에는 var user = this; 에서 mongoose 객체를 가져올때 문제가 생기는거 같습니다. (이전 회원가입때 사용한 save() 함수는 ctrl 을 눌러서 해당 함수로 이동이 가능하지만 로그인에서 사용한 save() 함수는 함수로 이동이 안되었습니다.)
user.save(function (err, user) {
console.log("test") // 해당 로그도 출력이 안되는걸로 보아 save function에서 어떤 문제가 있는것 같습니다. ㅠ
if(err) return cb(err);
cb(null, user);
});
*추가 07/28*
app.post('/api/users/login', (req, res)=>{
// email을 db에서 조회
User.findOne({email : req.body.email}, (err, userInfo) => {
if(!userInfo){
return res.json({
loginSuccess : false,
message : "일치하는 이메일이 없습니다."
})
}
// email이 있다면 비밀번호 체크
userInfo.comparePassword(req.body.password, function(err, isMatch) {
if(!isMatch){
return res.json({loginSuccess:false, message:"비밀번호가 틀렸습니다."});
}
//비밀번호까지 맞으면 토큰 생성.
userInfo.generateToken((user) => {
const userSave = new User(user)
userSave.save((err,userInfo)=>{ // 가져온 토큰으로 저장
if(err) return res.status(400).send(err);
res.cookie("x_auth", userInfo.token)
.status(200)
.json({loginSuccess:true, userId: userInfo._id});
})
});
});
})
});
User.js 에서 const user = this; 로 받아올때 user 정보는 정상적으로 가져오지만, save() 함수는 호출할 수 없는걸 확인했습니다. 그래서 위와 같이 app.js 에서 해결했는데 괜찮은가요?
https://www.inflearn.com/questions/30724
이 글이랑 비슷한 증상인것 같습니다.
2. 부가적인 질문입니다. save() 함수 안에서 선생님께서는
if(err) return cb(err); // save 실패시
cb(null, user); // save 성공시
이와 같이 코드를 작성하셨는데, if 단에서는 callback 함수를 return 해주는데 성공시에는 왜 return을 사용하지 않고 cb 함수를 호출하는지 알수있을까요? 두가지의 차이가 무엇인지 궁금합니다.
혹시나 도움이 되실까 싶어 github 주소를 남기겠습니다.
https://github.com/dding-g/node-study
감사합니다.
답변 1
1
안녕하세요 ~! 지금 확인하다가 여러 코드가 조금 섞여 있어서 session을 사용하셔서
제가 만약 확인 하려면 분석하는 시간이 걸리겠네요 ㅠ
우선 두번째 질문에 답변을 드리자면
return 은 명시적으로 여기서 소스를 더이상 내려가지 않게 막아줍니다.
그러기에 err 가 나면 그 아래부분 코드는 더이상 실행될 일이 없어지죠
하지만 이미 return 이 없는 부분은 이미 그 부분이 마지막 줄이기 떄문에 return을 명시적으로 넣어주지 않아도
마지막 줄이기에 더 이상 실행될 코드가 없어서 return 을 넣어주는게 옵션 사항이 됩니다.
감사합니다 ~ !