인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

함지현님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

FindOne 함수 이용해서 하나의 데이터만 찾기

[세션 10] FindOne 함수 이용해서 하나의 데이터만 찾기에서

작성

·

81

0

http://localhost:3000/posts/:id 를 send하게되면

NotFoundException()이 실행이 되야하는데

스크린샷 2024-12-27 18.52.10.png

이런 에러가 나옵니다

async getPostById(id: number) {
        const post = await this.postsRepository.findOne({
          where: {
            id,
          },
        });

        if (!post) {
          throw new NotFoundException();
        }

        return post;
    }

잘 입력한 것 같은데 . 왜그런가요?

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

에러를 분석할때는 항상 에러 메세지를 이해 해야합니다.

NaN 에러는 "숫자가 아닌 값을 숫자가 필요한 위치에 넣었을때 생기는 에러"입니다.

그러니 코드만 봐서는 절대로 알 수 없는 에러죠.

에러가 발생하는 위치에서 실제 어떤 값을 입력하고 있는지 확인 해보세요 (출력등).

숫자가 입력돼야하는 곳에 숫자 아닌 다른 값을 넣으셨을겁니다.

감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 함지현님.

작성하신 코드와 에러 메시지를 통해 문제를 파악해 보겠습니다. 현재 나타나는 에러는 ‘NaN’(숫자가 아님)이라는 값이 id로 전달되어 PostgreSQL에서 integer 유형으로 인식하지 못해 발생하는 것 같습니다.

문제 원인

에러 메시지로부터, getPostById 함수의 id 파라미터가 숫자가 아닌 값으로 호출되고 있음이 추정됩니다. 실제로 해당 값이 NaN일 때, 데이터베이스 쿼리가 실패하게 됩니다. 이는 올바른 숫자를 기대하는 쿼리에 잘못된 파라미터를 전달했기 때문입니다.

해결 방법

  1. 유효성 검사 추가: id가 숫자인지 확인하고, 만약 숫자가 아니라면 직접적으로 에러를 발생시켜 주도록 하세요.

예를 들어 TypeScript에서는 다음과 같이 구현할 수 있습니다:

   async getPostById(id: any) {
       const parsedId = parseInt(id, 10);
       if (isNaN(parsedId)) {
           throw new BadRequestException('Invalid ID format');
       }
       
       const post = await this.postsRepository.findOne({
           where: {
               id: parsedId,
           },
       });

       if (!post) {
           throw new NotFoundException();
       }

       return post;
   }
  1. 라우팅 경로 및 파라미터 검증: 요청 경로와 전달되는 파라미터가 올바른 타입인지 미리 검증합니다. Express.js 또는 NestJS에서 라우팅 경로를 설정할 때, 타입스크립트에서 자동 타입 검사를 활용하여 이와 같은 문제를 예방할 수 있습니다.

관련된 내용은 아래 링크를 참고할 수 있습니다:
- [NestJS] HTTP 파라미터 검증 - Param Decorator 사용법
- [NestJS] 데이터 전송 시 유효성 검사 방법

위 두 가지 조치가 문제를 해결하는 데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.