[TIL] 230728

김주희·2023년 7월 28일
0

내배캠 11주차 TIL

목록 보기
5/5

▶️ 테이블의 PK는 꼭 있어야 할까?

▶️ Invalid status code: undefined

  • 컨트롤러, 서비스, 레파지토리 레이어 모두 return문이 있고, 오타도 없는 걸 전부 확인 했고, api 주소 확인, 브라우저에서도 localhost로 잘 열리는 지도 확인, DB 마이그레이션이 되어 있는 것도 확인했는데도 계속 오류가 떴다.
  • 문제는......
createItem = async (req, res) => {
    const { name, price, type } = req.body;
    const { status, message } = this.itemService.createItem(
      name,
      price,
      type
    );

    return res.status(status).json({ message });
};
  • await이 없어서였다😱.....몇시간을 헤맸는데ㅠㅠㅠㅠ 코드를 다시 새로 짜보면서 원인을 찾았다. 역시 해결이 안되면 처음부터 차근차근 해보자. 어제는 .env 파일 오타, 오늘은 await으로 많은 시간동안 삽질했으니 이제 다신 이런 실수 안하겠지.

▶️ 유효성 검증 함수 분리

  • 저번 과제 튜터님이 리뷰해주신대로 유효성 검증을 하는 부분은 따로 분리해서 함수로 만들어 해보기로 했다.
// 상품 추가 유효성 검증
  validationCreateItem = async (name, price, type) => {
    if (!name) {
      throw new MakeError(400, '상품 이름을 입력해주세요.', 'invalid request');
    }

    if (!price) {
      throw new MakeError(400, '상품 가격을 입력해주세요.', 'invalid request');
    }

    const values = Object.values(Enum.itemType);

    if (!type || !values.includes(type)) {
      throw new MakeError(
        400,
        '알맞은 상품 타입을 선택해주세요.',
        'invalid request'
      );
    }

    const findItemName = await this.itemRepository.findOneItemName({ name });

    if (findItemName) {
      throw new MakeError(
        400,
        '이미 존재하는 상품 이름입니다.',
        'invalid request'
      );
    }

    return null;
  };

  // 상품 추가 API
  createItem = async (name, price, type) => {
    const validationError = await this.validationCreateItem(name, price, type);

    if (validationError) {
      return validationError;
    }

    await this.itemRepository.createItem({ name, price, type });

    return true;
  };
  • 기존 과제에서 했던 것처럼 서비스 레이어에서 return문을 쓰면 무조건 컨트롤러 레이어로 넘어가기 때문에 validationCreateItem의 return null 이부분에서 오류가 떴다. (return문엔 무조건 status와 message가 있어야 했음.)
  • 지난 팀프로젝트에서 다른 팀원이 하셨던 방법으로 status와 message를 전달 받기로 했다. throw로 서비스 레이어에서 처리를 하고 성공했을 경우만 return문을 true로 컨트롤러 레이어로 전달했다.
profile
꾸준히 하자

0개의 댓글