NestJS Filter - HttpException 필터

 NestJS 공식 설명 : https://docs.nestjs.com/exception-filters


에러를 처리하다보면 일정한 규격의 응답을 해야할 필요가 있다. 프런트에서 일정한 양식의 에러코드를 응답해야 디버깅 하기 편리하기 때문이다. 


HTTP에서 에러가 발생시 기존은 HttpException을 이용해서 에러를 응답했다. 하지만 필터를 적용해서 동일하게 응답하도록 수정할수 있다.


// src/common/http-expection.filter/http-expection.filter.ts

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

// HttpException을 받아서 수정후 응답
@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,
      });
  }
}


위 코드를 "HttpExpection"을 사용할때 Global로 적용할려면 main.ts파일에서 코드를 추가해야 한다.


// src/main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { ResponseInterceptor } from './common/interceptor/response.interceptor';
import { HttpExceptionFilter } from './common/http-expection.filter.ts/http-expection.filter';

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

  // Swagger Document를 설정
  const options = new DocumentBuilder()
    .setTitle('nest API')
    .setVersion('1.0')
    .build();

  // Swagger Document의 문서를 api(/api-docs)로 설정할수 있게 셋팅
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api-docs', app, document);

  // 모든 HttpException의 필터가 적용되도록 설정
  app.useGlobalFilters(new HttpExceptionFilter());


  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();


// src/common/app.service.ts

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

@Injectable()
export class AppService {
  getHello(): string {
    // 테스트를 위한 HttpException 에러 생성
    throw new HttpException('test error', 200)
    return 'Hello World!';
  }
}


각각의 코드를 수정하고 Swagger로 응답값을 확인하면 아래와 같다.


사진1) filter를 통과한 응답값



실제로는 에러 값이 400이상 나오지만 해당 글에서는 statusCode도 변경할수 있는것을 보여주기위해 일부러 200값으로 응답하게 했다.


댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)