인프런 커뮤니티 질문&답변
[세션 10] FindOne 함수 이용해서 하나의 데이터만 찾기에서
작성
·
99
0
http://localhost:3000/posts/:id 를 send하게되면
NotFoundException()이 실행이 되야하는데

이런 에러가 나옵니다
async getPostById(id: number) {
const post = await this.postsRepository.findOne({
where: {
id,
},
});
if (!post) {
throw new NotFoundException();
}
return post;
}잘 입력한 것 같은데 . 왜그런가요?
답변 2
0
안녕하세요!
에러를 분석할때는 항상 에러 메세지를 이해 해야합니다.
NaN 에러는 "숫자가 아닌 값을 숫자가 필요한 위치에 넣었을때 생기는 에러"입니다.
그러니 코드만 봐서는 절대로 알 수 없는 에러죠.
에러가 발생하는 위치에서 실제 어떤 값을 입력하고 있는지 확인 해보세요 (출력등).
숫자가 입력돼야하는 곳에 숫자 아닌 다른 값을 넣으셨을겁니다.
감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다. 함지현님.
작성하신 코드와 에러 메시지를 통해 문제를 파악해 보겠습니다. 현재 나타나는 에러는 ‘NaN’(숫자가 아님)이라는 값이 id로 전달되어 PostgreSQL에서 integer 유형으로 인식하지 못해 발생하는 것 같습니다.
문제 원인
에러 메시지로부터, getPostById 함수의 id 파라미터가 숫자가 아닌 값으로 호출되고 있음이 추정됩니다. 실제로 해당 값이 NaN일 때, 데이터베이스 쿼리가 실패하게 됩니다. 이는 올바른 숫자를 기대하는 쿼리에 잘못된 파라미터를 전달했기 때문입니다.
해결 방법
- 유효성 검사 추가:
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;
}
- 라우팅 경로 및 파라미터 검증: 요청 경로와 전달되는 파라미터가 올바른 타입인지 미리 검증합니다. Express.js 또는 NestJS에서 라우팅 경로를 설정할 때, 타입스크립트에서 자동 타입 검사를 활용하여 이와 같은 문제를 예방할 수 있습니다.
관련된 내용은 아래 링크를 참고할 수 있습니다:
- [NestJS] HTTP 파라미터 검증 - Param Decorator 사용법
- [NestJS] 데이터 전송 시 유효성 검사 방법
위 두 가지 조치가 문제를 해결하는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





