작성
·
193
0
코드복습중에 비동기, 동기처리 관련하여 궁금한점이 생겨 질문합니다!
const User = require('../models/user');
const bcrypt = require('bcrypt');
exports.join = async (req, res, next)=>{
const { nick, email, password } = req.body;
try {
const exUser = await User.findOne({where: {email}});
if(exUser){
return res.redirect('/join?error=exist')
}
const hash = await bcrypt.hash(password, 14);
await User.create({
nick,
email,
password: hash,
});
return res.redirect('/');
} catch(err){
console.error(err);
next(err);
}
}
위의 코드가 수업중에 작성하신 코드입니다
여기서 아래부분만 이처럼 await를 뺀 상태로 변경하였는데,
const exUser = User.findOne({where: {email}});
if(exUser)
가 true
값이 되어
return res.redirect('/join?error=exist')
으로 빠지게 되었습니다.
제가 이해하기로는 await가 붙은 비동기 처리들은 동기처리들이 완료되어 호출스택이 비기전까지는 task큐에서 대기하는 것으로 알고 있는데,
위의 현상대로면 await가 붙은 아래 코드 2개가 먼저 실행되고
const hash = await bcrypt.hash(password, 14);
await User.create({
nick,
email,
password: hash,
});
이 코드가 실행된 것 같은데
const exUser = User.findOne({where: {email}});
왜 이런 현상이 발생하는지 궁금합니다!!! 감사합니다
답변 1
1
아뇨 findOne이 먼저 실행되는게 맞습니다. await을 붙이지않으면 exUser는 Promise가 되고 Promise는 if문에서 무조건 true입니다.