▶️ 테이블의 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;
};
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로 컨트롤러 레이어로 전달했다.