인프런 커뮤니티 질문&답변

area409@naver.com님의 프로필 이미지
area409@naver.com

작성한 질문수

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

12강 토큰생성 질문드립니다.

작성

·

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

John Ahn님의 프로필 이미지
John Ahn
지식공유자

안녕하세요 ~!  지금 확인하다가  여러 코드가 조금 섞여 있어서 session을 사용하셔서 
제가 만약 확인 하려면 분석하는 시간이 걸리겠네요 ㅠ 

우선 두번째 질문에 답변을 드리자면 
return 은 명시적으로 여기서 소스를 더이상 내려가지 않게 막아줍니다. 

그러기에 err 가 나면 그 아래부분 코드는 더이상 실행될 일이 없어지죠 
하지만 이미 return 이 없는 부분은 이미 그 부분이 마지막 줄이기 떄문에  return을 명시적으로 넣어주지 않아도 
마지막 줄이기에 더 이상 실행될 코드가 없어서 return 을 넣어주는게 옵션 사항이 됩니다.

감사합니다 ~ ! 

area409@naver.com님의 프로필 이미지
area409@naver.com

작성한 질문수

질문하기