[NestJS] Exception filters

곽태민·2023년 7월 27일
0

NestJS

목록 보기
7/8

Exception filters

Nest에는 어플리케이션 전체에서 처리되지 않은 모든 예외 처리를 담당하는 기본 제공 예외 레이어가 함께 제공된다.

응용 프로그램 코드에서 예외를 처리하지 않으면 해당 계층에서 예외를 포착해서 적절한 사용자 친화적 응답을 보낸다.

기본적으로 이 작업은 HttpExcepion 유형의 예외를 처리하는 기본 제공 전역 예외 필터에 의해 실행된다. 예외가 인식되지 않으면 기본 제공 예외 필터는 다음과 같은 기본 JSON 응답을 만든다.

{
	"statusCode": 500,
	"message": "Internal server error"
}

Throwing standard exceptions

Nest@nestjs/common 패키지에서 노출되는 내장 HttpException 클래스를 제공한다. 일반적인 HTTP REST/GraphQL API 기반 어플리케이션인 경우 특정 오류 조건이 발생할 때 표준 HTTP 응답 객체를 보내는 것이 가장 좋다.

예를 들어, CatsController에는 findAll() 메서드 (GET)가 있다. 이 Route Handler가 어떤 이유로 인해서 throw를 한다 가정하면, 다음과 같이 하드 코딩을 할 수 있다.

@Get()
async findAll() {
	throw new HttpException('Forbidden', HttpStatus.FORBIDDEN)
}

(HttpStatus@nestjs/common 패키지에서 불러옴.)

클라이언트에서 엔드포인트를 호출하면 응답은 아래와 같다.

{
	"statusCode": 403,
    "message": "Forbidden"
}

HttpException 생성자는 response을 결정하는 두 개의 필수 인자를 사용한다.

  • response 인수는 JSON response body을 정의한다. 아래에 설명된 대로 문자열 또는 객체일 수 있다.
  • 객체 인수는 HTTP 상태 코드를 정의한다.

기본적으로 JSON response body에는 두 가지 속성이 포함된다.

  • statusCode: 기본값은 status 인수에 제공된 HTTP 상태 코드다.
  • message: status에 따른 HTTP 오류에 대한 간단한 설명.

JSON response body의 메시지 부분만 재정의하려면 response 인수에 문자열을 제공한다.

전체 JSON response body을 재정의하려면 response 인수에 객체를 전달한다. Nest는 객체를 직렬화하고 JSON response body로 반환한다.

두 번째 constructor 인수인 status유효한 HTTP 상태 코드여야한다. 좋은 예시는 @nestjs/common에서 가져온 HttpStatus enum을 사용하는 것이다.

오류 원인을 제공하는데 사용할 수 있는 세 번째 constructor 인수 옵션이 있다.

이 원인 객체는 response 객체로 직렬화되지 않지만 HttpException을 발생시킨 내부 오류에 대한 중요한 정보를 제공하여 logging 목적에 유용할 수 있다.

다음은 전체 response body를 재정의하고, 오류 원인을 제공하는 예시 코드다.

@Get()
async findAll() {
	try {
    	await this.service.findAll();
    } catch (error) {
    	throw new HttpException({
        	status: HttpStatus.FORBIDDEN,
          	error: "This is a custom message',
        }, HttpStatus.FORBIDDEN, {
        	cause: error
        });
    }
}

위 코드를 실행하면 reponse 값은 다음과 같다.

{
	"statusCode": 403,
    "error": "This is a custom message"
}
profile
Node.js 백엔드 개발자입니다!

0개의 댓글