async / await [ TIL ] [ node.js ]

2023. 6. 22. 20:15TIL&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 관계도 설계해보면서 익숙해질때까지 반복해봐야겠다.