TIL

24/01/05 TIL __ nestjs에서 에러처리 HttpExceptionFilter

GABOJOK 2024. 1. 5. 23:51

 

 

오늘은 nestjs에서 예외처리를 어떻게 해야할지 알아본걸 정리하려 한다. 

 

스파르타에서 지급된 강의자료에 보면,

 throw new BadRequestException()

 

이렇게 처리하고 있는데, 이 경우 express 에서처럼 에러핸들링을 어떻게 해야할지 감이 안잡혔다.

 

 

 

일단 위와 같이 처리를 하게 되면 상태코드를 가지고 있어서 상태코드를 적지 않아도 되지만,

다른 에러들 까지 함께 처리해 줄 수 있도록 express의 미들웨어 같은걸 걸고싶었다.

방법이 있었는데 바로 HttpExceptionFilter이다.

 

 

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

//예외처리
@Catch()
export class HttpExceptionFilter implements ExceptionFilter {
  // 임플리 먼츠 하면 캐치가 들어올 수 밖에 없음.
  catch(exception: any, host: ArgumentsHost) {
    const ctx = host.switchToHttp(); //실행컨텍스트 에서 res객체 가져옴.
    const response = ctx.getResponse<Response>(); //실행컨텍스트 에서 res객체 가져옴.
    const status = exception.getStatus(); //exception에서 에러번호와 에러 내용가져옴.
    const err = exception.getResponse() as
      | { message: any; statusCode: number }
      | { error: string; statusCode: 400; message: string[] }; //exception에서 에러번호와 에러 내용가져옴.

    //클래스 벨리데이터 오류인 경우
    if (typeof err !== 'string' && err.statusCode === 400) {
      return response.status(status).json({
        success: false,
        code: status,
        data: err.message,
      });
    }
    //만든 에러인 경우
    if (typeof err !== 'string') {
      response.status(status).json({
        success: false,
        code: status,
        data: err.message,
      });
    }

    throw new Error('Method not implemented.');
  }
}

 

main.ts에도 이렇게 걸어준다.

  app.useGlobalFilters(new HttpExceptionFilter());