NestJS 에러 처리하기

이주희·2023년 12월 26일
0

NestJS

목록 보기
2/2

기존 생성돼있는 Exceptiont 사용

throw new NotFoundException();


HttpException으로 메세지 처리

throw new HttpException('error!', HttpStatus.NOT_FOUND);

NestJS는 httpException 이라는 인터페이스를 제공해서 message 지정도 가능하다!


GlobalException 생성

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter());

  const serverConfig = config.get('server');
  const port = serverConfig.port;
  setupSwagger(app);

  await app.listen(port);
}

애플리케이션 전역에 exception filter을 등록

exception 처리결과 응답 형태까지 커스터마이징한다

  1. BasicException 정의해서 원하는 내용 담기
// 커스텀 exception에 어떤 정보를 담을지 정의
export class BasicException extends HttpException {
  code: number;

  //super로 부모가 가진 message, status 인자 값 할당, code에 값 할당
  constructor(message: string, status: number, code: ErrorCode) {
    super(message, status);
    this.code = code;
  }
}
  1. ExceptionFilter 생성
    @Catch()로 하면 모든 에러를 잡는다..!
@Catch()
export class GlobalExceptionFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    //ctx를 실행환경에서 가져와서 http 상태 코드를 할당한다
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();

    let code;
    let status;

    if (exception instanceof BasicException) {
      code = exception.code;
      status = exception.getStatus();
    } else if (exception instanceof HttpException) {
      code = ErrorCode.NEST_OFFER;
      status = exception.getStatus();
    } else {
      //서버 에러 (500 또는 nest 제공 에러 )
      status = 500;
      code = ErrorCode.INTERNAL_SERVER_ERROR;
    }

    response.status(status).json({
      code,
      message: (exception as any).message,
      timestamp: new Date().toISOString(),
    });
  }
}
  1. ErrorCode 정의해놓기
export enum ErrorCode {
  //Server error
  NEST_OFFER = 1,
  INTERNAL_SERVER_ERROR = 2,

  //Pet error
  INVALID_PET_ID = 1000 + 1,
}
  1. 커스텀 Exception 제작해서 적용
export class InvalidPetIdException extends BasicException {
  constructor() {
    super(
      '존재하지 않는 petId 입니다.',
      HttpStatus.NOT_FOUND,
      ErrorCode.INVALID_PET_ID,
    );
  }
}

사용시에는 throw new InvalidPetIdException();와 같이 사용한다!

결과

0개의 댓글