코딩일상

[nest.js] 예외 처리, 예외 필터를 만들어 보자 본문

개발 공부/nest.js

[nest.js] 예외 처리, 예외 필터를 만들어 보자

solutionMan 2022. 12. 5. 15:27
반응형

 

 

Exception 적용전  기본 nest 자체 에러처리 값


HttpException을 적용한경우

HttpException('메세지', HTTPstatusCode)를 넣어서 사용을 할수가 있다.

//cats.controller.ts

@Controller('cats')
export class CatsController {
  //dependency injection 의존성 주입
  constructor(private readonly catsService: CatsService) {}

  // cats/
  @Get()
  getAllcat() {
    throw new HttpException('message', 401);
    return 'get all cat api';
  }

HttpException을 커스터마이징 한경우

//cats.controller.ts
  @Get()
  getAllcat() {
    throw new HttpException(
      {
        status: HttpStatus.FORBIDDEN,
        error: 'This is a custom message',
      },
      HttpStatus.FORBIDDEN,
    );
    return 'get all cat api';
  }

HttpStatus.FORBIDDEN의 값은 403이다.

 


요청 별 에러 처리를 하나하나 하지않는 방법

Handler-level 

1) htttp-exception.filter.ts파일을 만들어서 적용을시킨다.

//http-exception.filter.ts

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();

    //res.status(400).send({}) ----express
    response.status(status).json({
      statusCode: status,
      timestamp: new Date().toISOString(),
      path: request.url,
    });
  }
}

위 HttpExceptionFilter 를 cats.controller GET요청에 적용한 모습

//cats.controller.ts

  @Get()
  @UseFilters(HttpExceptionFilter)
  getAllcat() {
    throw new HttpException('api error', 401);
    return 'get all cat api';
  }

결과값

throw new HttpException('api error', 401);의 에러메시지와 StatusCode를('api error', 401)반영하기위해 

http-exception.filter.ts에 추가한 사항들

 

//http-exception.filter.ts

@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();
    const errorMessage = exception.getResponse(); //예외 응답값을 받기위해 추가

    //res.status(400).send({}) ----express
    //HttpExceptionFilter
    response.status(status).json({
      statusCode: status, //응답 statusCode
      success: false,
      timestamp: new Date().toISOString(),
      path: request.url,
      errorMessage, //예외 응답값 추가
    });
  }
}


Global-level 예외 에러 처리 를 하나하나 하지않는 방법

//main.ts

import { HttpExceptionFilter } from './http-exception.filter';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter());//코드 추가
  await app.listen(8000);
}
bootstrap();

main.ts에서 9번째 줄을 추가 하여 진행하면 프로젝트 전체 예외처리가 된다  다만 아래같은 상황와 같은 응답값이 발생할경우

(아래의 상황이란 우리가 예외처리를 해놓지 않은곳에서 발생하는 에러)

조건문을 이용하여 error 메시지의 타입과 형태에 따라 응답방식을 적용해준다.

//http-exception.filter.ts

@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();
    const error = exception.getResponse() as
      | string
      | { error: string; statusCode: number; message: string | string[] };

    if (typeof error === 'string') {
      response.status(status).json({
        success: false,
        timestamp: new Date().toISOString(),
        path: request.url,
        error,
      });
    } else {
      response.status(status).json({
        success: false,
        timestamp: new Date().toISOString(),
        ...error,
      });
    }
  }
}

위와같이 우리가 원하는 형태로 예외에러처리를  할 수있다.


레퍼런스

 

 

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 Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

반응형
Comments