[TIL] nest.js 예외처리

Cherry Jin·2024년 2월 13일
0

sparta_내배캠

목록 보기
51/53
post-thumbnail

최종 프로젝트의 프론트를 정리하면서 보기 싫었던 JSON 형태의 오류 페이지를 정리했다.

{
  "statusCode": 404,
  "message": "에러메시지 두둥 - 이젠 보지 말자"
}

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

Nest.js 에서는 HttpException 필터를 제공하고 있다. 엔드포인트를 통해 호출된 응답에 따라 에러 페이지를 호출할 수 있는 것이다!

경우에 따라 main.ts에서 전체적으로 모든 경로의 에러를 처리하는 필터를 만들 수 있다. main.ts에서 글로벌 필터를 씌워놓았더니 프론트의 엑시오스 요청에 따른 에러도 에러페이지로 만들어버리는 일이 있어 if로 예외처리를 했다.

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

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

   if (exception instanceof HttpException) {
     const status = exception.getStatus();
     const exceptionResponse = exception.getResponse();
     const errorResponse =
       typeof exceptionResponse === 'string' ? { message: exceptionResponse } : exceptionResponse;

     // 404 에러일 경우에만 에러페이지로 보내기
     if (status === HttpStatus.NOT_FOUND) {
       const redirectUrl = `/error-page?errorUrl=${encodeURIComponent(request.url)}`;
       response.status(status).redirect(redirectUrl);
     } else {
       // 기존 에러 응답 구조를 유지
       response.status(status).json({
         ...errorResponse,
         statusCode: status,
         timestamp: new Date().toISOString(),
         path: request.url,
       });
     }
   } else {
     // HttpException이 아닌 경우, 내부 서버 에러로 처리
     const redirectUrl = `/error-page?errorUrl=${encodeURIComponent(request.url)}`;
     response.status(HttpStatus.INTERNAL_SERVER_ERROR).redirect(redirectUrl);
   }
 }
}

더 좋은 방법이 있을텐데... 프로젝트 마무리 일정이 다가오고 있어 요렇게만 했다.
/error-page?errorUrl=${encodeURIComponent(request.url)} 이런 경로로 보내진 error-page 에서는 쿼리 값을 받아서 팀에게 알리도록 연결시켰다.

  @Get('/error-page')
  @Page('error')
  getErrorPage(@Query('errorUrl') errorUrl: string) {
    const pageTitle = '에러 페이지';
    if (errorUrl === '/favicon.ico') {
      return { pageTitle, errorUrl: '' };
    }
    return { pageTitle, errorUrl: decodeURIComponent(errorUrl) };
  }

이전 페이지를 받아오게 만들어놨더니 errorUrl에 자꾸만 파비콘 경로가 나와서 예외처리함


만들어진 에러페이지에서는 팀에게 알리기 를 토글해서 메시지를 보낼 수 있다. 피드백을 바로 수용할 수 있도록 에러페이지에서 메시지를 보내면 아래와 같이 팀의 디스코드에서 웹훅으로 피드백을 받아볼 수 있다.

아까 받은 errorUrl이 이쪽으로 전달되는것. 한번의 에러페이지에서는 한번만 피드백을 보낼 수 있다....!

profile
풀스택이 되버린 주니어 개발자

0개의 댓글