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

SJ님의 프로필 이미지
SJ

작성한 질문수

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

Comment Count 작업하기

http Exception filter 적용

작성

·

37

0

http Exception filter 적용이 안됩니다.

 

 

import {
  ArgumentsHost,
  Catch,
  ExceptionFilter,
  HttpException,
} from '@nestjs/common';
import { Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    console.log('exception', exception);
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const status = exception.getStatus();
    const err = exception.getResponse() as
      | string
      | { error: string; statusCode: number; message: string | string[] };
    console.log('err', err);
    if (typeof err !== 'string' && err.error === 'Bad Request') {
      return response.status(status).json({
        ok: false,
        statusCode: status,
        data: err.message,
      });
    }

    response.status(status).json({
      ok: false,
      statusCode: status,
      data: err,
    });
  }
}

위처럼 하고난뒤에
main.ts 파일에
app.useGlobalFilters(new HttpExceptionFilter());

추가했는데 위처럼 에러 포맷이 안나옵니다.
const foundUser = await this.dataSource.getRepository(UserEntity).findOne({ where: { id } });
if (!foundUser) { console.log('User not found'); throw new BadRequestException('User not found'); }
{

"response": {

"message": "User not found",

"error": "Bad Request",

"statusCode": 400

},

"status": 400,

"options": {},

"message": "User not found",

"name": "BadRequestException"

}

답변 2

0

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

안녕하세요!

말씀주신 내용으로는 문맥을 전혀 파악 할 수 없습니다.

Filter에 진입은 되는 상황이신건가요?

감사합니다!

SJ님의 프로필 이미지
SJ
질문자

아 Filter 에 진입이 전혀 안되더라고요
console.log 로 출력해봤는데 로그가 안찍혀요

검색도 해봐서 방은으로

main.ts 에서 추가

app.module.ts 추가를 각각 시도해봤는데도 안되더라고요 ㅠ

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

다른곳에서 이미 에러를 잡고있는건 아닌가요?

한번 잡힌 에러는 다시 잡히지 않습니다.

SJ님의 프로필 이미지
SJ
질문자

혹시 몰라서 확인해봤는데 그런건 아닌것 같습니다.

제가 모르고 있을수도 있는데 ,

다른곳으로 진입이 된다고 하면 어떻게 확인하면 될까요 ??

 

http exception filter 부분 로그와

스크린샷 2024-11-29 오후 4.21.43.png

 

main.ts 파일에서
app.useGlobalFilters(new HttpExceptionFilter());

셋팅은 이렇게 했습니다.

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

안녕하세요!

제가 직접 봐드리는게 나을 것 같습니다.

레포지토리 깃헙에 올려서 링크 주시면 확인 해보겠습니다.

감사합니다!

0

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

NestJS에서 HTTP Exception Filter를 적용하여 에러 응답 형식을 커스텀하고자 하셨네요. 에러 포맷이 의도와 다르게 동작할 때 주로 발생하는 문제와 해결 방법을 아래에 공유드립니다.

  1. 전역 필터 등록 확인: 먼저, app.useGlobalFilters(new HttpExceptionFilter());를 통해 Exception Filter가 메인 애플리케이션의 전역으로 적용되어 있는지 확인해보셔야 합니다. 이 대목은 이미 잘 설정하신 것 같습니다.

  2. 필터에서의 예외 처리: HttpException 클래스에서 제공하는 getResponse()getStatus() 메소드가 호출되어 올바른 상태와 응답을 반환하는지 로그 등을 통해 확인하는 것이 좋습니다. catch 메소드 내부의 console.log를 통해 예외가 발생했을 시 로그가 출력되는지 확인해보세요. 로그가 출력되지 않는다면 필터가 적용되지 않았을 수도 있습니다.

  3. 배포 환경의 문제: 개발 환경과 배포 환경에서 설정의 차이가 있는지 확인하세요. 배포된 환경에서는 main.ts의 설정이 다르게 되어 있을 수 있습니다.

  4. NestJS 버전 확인: 혹시 NestJS의 버전이 강의와 다르다면, 필터 등록 방식이나 작동 방식에 차이가 있을 수 있습니다. 이를 확인 후 NestJS 공식 문서를 참조하시거나, NestJS 공식 가이드라인을 따라 버전에 맞는 설정을 확인해 주세요.

  5. 커스텀 필터 코드 논리 확인: 특히 err가 문자열이 아닌 경우에 대한 처리가 예외를 잘 잡아내고 있는지 확인해야 합니다. 현재의 로직은 err.error가 ‘Bad Request’일 때만 별도 처리를 하고 있습니다. 다른 케이스도 고려하여 처리할 수 있도록 논리를 수정해 보세요.

이외에도 유사한 문제에 대한 다른 학습자들의 경험이 도움이 될 수 있습니다. 다음 유사한 주제의 Q&A 링크를 참조해 보시기 바랍니다:

혹시 문제 해결이 계속 어렵다면, 강의의 Q&A 게시판을 통해 더 많은 정보를 공유하시고, 다른 경험이 있는 학습자나 강사님의 도움을 받아 보시기 바랍니다.

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

SJ님의 프로필 이미지
SJ

작성한 질문수

질문하기