Exception filters

생성일
Dec 21, 2021 11:20 AM
태그
처리되지 않은 모든 예외를 처리하는 예외 레이어이다. 앱 코드에서 예외를 처리하지 않으면 이 레이어에서 예외를 포착하여 적절한 사용자 친화적인 응답을 자동으로 보낸다.
 
Nest는 내장 에러 처리 클래스 HttpException을 제공한다.
@Get()
async findAll() {
  throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
} // { "statusCode": 403, "message": "Forbidden" }
이렇게 사용하면 됨
 

Exception filters

기본 예외필터가 자동으로 많은 경우의 에러를 처리하지만, 예외 레이어에 대한 완전한 제어를 원할 경우 예외필터를 사용한다.
 
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.getStatus();

    response
      .status(status)
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }
}
exception ⇒ 현재 처리중인 예외 객체
host ⇒ ArgumentsHost 인수를 검색하는 메서드를 제공하는 클래스. 추상화의 이유는 모든 컨텍스트에서 작동시키기 위해서
 
@Post()
@UseFilters(new HttpExceptionFilter())
async create(@Body() createCatDto: CreateCatDto) {
  throw new ForbiddenException();
}
위와 같이 UseFilters 데코레이터로 바인딩하면 된다.
 
@Post()
@UseFilters(HttpExceptionFilter)
async create(@Body() createCatDto: CreateCatDto) {
  throw new ForbiddenException();
}
클래스로 넘겨주는 경우 프레임워크에 대한 인스턴스화 책임을 남겨 종속성 주입을 활성화할 수 있다. → 이해가 안되는 부분
 
 
@UseFilters(new HttpExceptionFilter())
export class CatsController {}
컨트롤러 전체에 필터를 적용하거나
 
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter());
  await app.listen(3000);
}
bootstrap();
앱전체에 적용할 수 있다.
 

Loading Comments...