본문 바로가기
개발/nest.js

nestjs + typeorm backend 예외처리 (7)

by 아크투어 2023. 3. 24.
반응형
 

1. 개요

 

 

2. Exception filters (예외필터) 개념

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

  • Nest에는 애플리케이션 전체에서 처리되지 않은 모든 예외 처리를 담당하는 예외 계층이 포함되어 있습니다.
  • 응용 프로그램코드에 의해 예외가 처리되지 않으면 이 계층에 의해 예외가 포착되어 자동으로 사용자에게 친숙한 응답이 전송됩니다.

 

 

3. Exception filters 적용

  • src > common > exception > http-exception.filter.ts 파일을 생성한다.
  • 오류가 발생시 해당 필터가 catch하여 json 형태로 오류메시지를 클라이언트에게 제공한다.
# http-exception.filter.ts

import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
  HttpStatus,
} 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 instanceof HttpException
        ? exception.getStatus()
        : HttpStatus.INTERNAL_SERVER_ERROR;

    const res: any = exception.getResponse();

    response.status(status).json({
      success: false,
      message: res.message,
    });
  }
}

 

 

  • 위코드를 적용후 강제로 오류발생시 아래와 같이 클라이언트는 오류메시지를 응답받는다.

 

 

  • main.ts에 아래코드를 추가한다.
  • 일일이 컨트롤러 메서드에 추가하지않고 전역으로 사용할수 있다.

# main.ts

import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { AppModule } from './app.module';
import { Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { ValidationPipe } from '@nestjs/common';

import { LoggingInterceptor } from './common/interceptors/logging.interceptor';
import { HttpExceptionFilter } from './common/exception/http-exception.filter';

async function bootstrap() {
  // Logger Level
  const app: NestExpressApplication = await NestFactory.create(AppModule, {
    logger:
      process.env.NODE_ENV === 'prod'
        ? ['error', 'warn', 'log']
        : ['error', 'warn', 'log', 'verbose', 'debug'],
  });

  // CORS
  app.enableCors({
    origin: '*',
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
    optionsSuccessStatus: 200,
  });

  // Interceptor
  app.useGlobalInterceptors(new LoggingInterceptor());

  // Exception Filter
  app.useGlobalFilters(new HttpExceptionFilter());

  const yamlConfig: ConfigService = app.get(ConfigService);
  const port: number = yamlConfig.get<number>('server.port');

  await app.listen(port, () => {
    Logger.log(`Application listening on port ${port}`);
  });
}
bootstrap();
반응형