[Nest JS] Exception filters

minidoo·2021년 10월 1일
0

NestJS

목록 보기
3/8
post-thumbnail
post-custom-banner

네스트는 애플리케이션 전체에서 처리되지 않은 모든 처리를 하는 예외 레이어가 내장되어 있다.
@nestjs/common 패키지는 HttpException 클래스를 제공한다.

import { Get, HttpException } from '@nestjs/common';

@Get()
async findAll() {
	throw new HttpException('Not Found All', 400);
}

클라이언트가 해당 엔드포인트를 호출하면 응답은 다음과 같다.

{
	statusCode: 400,
	message: 'Not Found All'
}

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

  • reponse 인수는 JSON 응답 본문을 정의한다. string 또는 object 형태로, object를 사용하는 경우 원하는 필드명으로 리턴할 수 있다.
  • status 인수는 HTTP 상태 코드를 정의한다.

예시는 아래와 같다.

import { Get, HttpException } from '@nestjs/common';

@Get()
async findAll() {
	throw new HttpException({
		status: 400,
		errorMessage: 'Not Found All'
	}, 400);
}
{
	status: 400,
	errorMessage: 'Not Found All'
}

HttpExceptionasync / await 함수 안에서 try / catch 와 사용하면 좋다.

// app.controller.ts

import { Controller, Get, HttpException } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  async findAll() {
    try {
      const result = await this.appService.findAll();
      return result;
    } catch (err) {
      throw new HttpException(
        {
          status: err.status,
          errorMessage: err.message,
        },
        err.status,
      );
    }
  }
}
// app.service.ts

import { HttpException, Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  constructor() {}

  async findAll() {
    try {
      const result = new Array(-1); // Invalid array length
      return result;
    } catch (err) {
      throw new HttpException('Invalid array length', 400);
    }
  }
}

app.service.ts 에 에러 코드를 작성하였다.

서비스에서 throw된 에러는 app.controller.ts 의 catch 문이 잡아낸다.
이때 서비스에서 보낸 statusCode는 err.status에 message는 err.message에 들어가 있다.

네스트의 Exception filters 는 모든 throw 에러를 잡아낼 수 있는 클래스이다.

Nest JS 공식문서

https://docs.nestjs.kr/exception-filters

post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 12월 7일

귀하가 제공한 정보는 우리의 관심을 끌었습니다. 이 비밀을 알려주셔서 감사합니다. 사무실이나 교실에서 진부한 느낌이 든다면 저희 게임을 플레이하고 몸과 마음을 재충전하세요. 감사합니다! https://cookieclicker-games.com

답글 달기