async / await [ TIL ] [ node.js ]
2023. 6. 22. 20:15ㆍTIL&WIL/TIL
Problem
express 를 이용하여 간단한 게시판 api 를 만들던중 undefined 가 발생했다.
Try
router.post("/", async (req, res) => {
console.log(req.body);
try {
const { title, content, userId } = postCreateValidation.validateAsync(
req.body
);
console.log(title, content, userId);
const post = await Post.create({
title,
content,
userId,
});
res.json(post);
} catch (err) {
if (err.isJoi) {
return res.status(422).json({ message: err.details[0].message });
}
res.status(500).json({ message: err.message });
}
});
postman 으로 날려보니 console.log 에 undefined 가 찍어있다.
이 것을 보았을때 떠올랐던 키워드는 동기와 비동기였다.
자바스크립트가 비동기로 작동한다는 것을 이전에 이벤트 루프를 공부하면서 알 수 있었다.
문제는 req.body 에서 값들을 꺼내오기 전에 console.log 가 실행되서 발생했다는 것을 알 수 있었다.
Solve
router.post("/", async (req, res) => {
console.log(req.body);
try {
const { title, content, userId } = await postCreateValidation.validateAsync(
req.body
);
console.log(title, content, userId);
const post = await Post.create({
title,
content,
userId,
});
res.json(post);
} catch (err) {
if (err.isJoi) {
return res.status(422).json({ message: err.details[0].message });
}
res.status(500).json({ message: err.message });
}
});
postCreateValidation.... 부분 앞에 await 으로 동기처리 해줌으로서 쉽게 해결할 수 있었다.
What I Learned
자바스크립트는 await 키워드를 만나면 해당 함수가 Promise 상태가 이행될 때 까지 기다렸다가 이행이 완료되면 그 결과를 반환하고 다음 코드를 실행한다는 것을 알게되었다. 비동기 를 동기적으로 실행되는 코드처럼 예측 가능해진다는 점이 좋았다.
마저 간단한 게시판 api 를 만들어보고 erd 관계도 설계해보면서 익숙해질때까지 반복해봐야겠다.
'TIL&WIL > TIL' 카테고리의 다른 글
express [ TIL ] [ node.js ] (0) | 2023.06.25 |
---|---|
params [ TIL ] [ node.js ] (0) | 2023.06.24 |
태스크 큐 이벤트루프(3) [ TIL ] [ Javascript ] (0) | 2023.06.21 |
Web API 이벤트루프(2) [ TIL ] [ Javascript ] (0) | 2023.06.20 |
호출 스택 이벤트 루프(1) [ TIL ] [ Javascript ] (0) | 2023.06.19 |