[TIL] Node.js 개인과제 (2) 23.06.15

이상훈·2023년 6월 15일
0

[내일배움캠프]

목록 보기
27/68

✔️오늘 한일!

  • Node.js 입문 강의 2회독 수강
  • 개인과제 배포 및 데이터베이스에 데이터 입력
  • api명세서 작성

Exports, require

try {
    new ObjectId(commentId);
  } catch (error) {
    return res.status(400).json({ message: "데이터 형식이 올바르지 않습니다" });
  }

router마다 서버가 꺼지지 않도록 param으로 들어오는 id값이 objectId인지 아닌지 유효성 검사를 위해 try catch구문을 다 넣어놨었는데, 중복되는 부분이기도 하고 가독성도 떨어지는 것 같아 함수화를 시켜보려 했다.

const checkObjectId = (req, res, next) => {
  const { postId } = req.params;
  if (!ObjectId.isValid(postId)) {
    return res.status(400).json({ message : "데이터 형식이 올바르지 않습니다." });
  }
  next();

해당 함수를 작성하고 테스트를 해보니 문제가 생겼다.
next()로 다음 미들웨어를 실행하게 하려했는데 다음 미들웨어로 넘어가지 않고 계속해서 데이터 형식이 올바르지 않다는 메세지만 출력되는 현상이 발생됐다.
아무래도 next()가 작동하지 않는 것 같아서 try catch를 섞어서 작성해보면 어떨까 싶어서 작성해봤다.

const checkObjectId = (req, res, next) => {
  const { postId } = req.params;
  try {
    if (!ObjectId.isValid(postId)) {
      throw Error("데이터 형식이 올바르지 않습니다.");
    }
    next();
  } catch (error) {
    return res.status(400).json({ message: error.message });
  }
};

ObjectId가 아니라면 해당 에러를 throw하여 에러메세지를 출력해주고 맞다면 next()로 다음 미들웨어를 실행해준다.
이런식으로 코드를 작성해보니 에러메세지만 반복출력되던게 해결이 됐다.

이제 이 함수를 export를 해보려고 했는데 import, export를 사용해본적은 있지만 commandJS는 아직 익숙하지 않아서 이것저것 구글링으로 찾아보다가 튜터님에게 질문을 드렸다.
접근 방법은 맞았었는데 디테일한 부분이 틀려서 실행이 되지 않았었다.

const checkObjectId = require("./posts.js")

이렇게 접근하는 것은 맞았지만 module을 두개 exports를 하면 안되는 것이였는데 두개를 넣다보니 오류가 발생했다.

먼저 함수를 내보내주려면

module.exports = { router, checkObjectId };

posts.js에서 객체형태로 묶어서 exports를 해주면 된다.

그 후에 comments.js에서 받을 때는

const { checkObjectId } = require("./posts.js");

구조분해할당하여 받으면 된다.


배포과정 및 테스트에서 애먹은게 몇개 있지만 해결방법이 너무나도 간단한 문제들이였다. 소위 말하면 삽질을 했다. 예를 들면 로컬스토리지에 데이터가 쌓여있고 배포한 ip에는 데이터가 없는데 빈배열이 나와서 왜그런지 한참을 찾는다던가,, yes를 입력하고 enter를 눌러야 하는데 기본 default값이 yes라고 생각하고 enter를 눌러서 진행이 안된다던가 등...
다 경험이라 생각하고 잊지말고 잘 기억해둬야겠다.

profile
코린이

0개의 댓글