6. Nest.js 광부왕 게임 서버 Filter 적용

2023. 3. 3. 16:31프로젝트/게임 서버 - Nest.js

1. src/common/filters/error.exception.ts 파일 생성

error.exceptions.ts 파일을 만들어서 해당 코드를 넣어준다.

서버 처리 중 에러 발생 시 필터를 이용사용 하여 처리 한다.

  • 1. 개발 중 에러 발생처리를 분기 처리 하여 개발 서버에서만 확인 하기 위해 console.log() 로 에러 값을 나타낸다.
  • 2. 에러 메시지가 String, Object 두 타입으로 발생 하기 때문에 형태를 확인하고 분기 처리한다.

 

import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
} from '@nestjs/common';
import { Response, Request } from 'express';
@Catch()
export class ErrorExceptionFilter implements ExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status =
      exception instanceof HttpException ? exception.getStatus() : 500;
    // 1. dev 개발서버 실행 일 때 에러 발생 시 로그 출력
    if (process.env.NODE_ENV === 'dev') {
      console.log('Error : ' + exception);
    }
    // 2. 에러 메시지가 String, Object 두 형태로 전달되기 때문에 분기 처리
    const error =
      exception instanceof HttpException
        ? (exception.getResponse() as
            | string
            | { error: string; statusCode: number; message: string | string[] })
        : 'Internal server error';

    if (typeof error === 'string') {
      response.status(status).json({
        result: false,
        statusCode: status,
        method: request.method,
        path: request.url,
        error,
      });
    } else {
      response.status(status).json({
        result: false,
        statusCode: status,
        method: request.method,
        path: request.url,
        ...error,
      });
    }
  }
}

2. main.ts에 useGlobalFilters 적용

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import expressBasicAuth from 'express-basic-auth';
import { AppModule } from './app.module';
//추가
import { ErrorExceptionFilter } from './common/filters/error.exception';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  //추가
  app.useGlobalFilters(new ErrorExceptionFilter());
  if (process.env.NODE_ENV === 'product') {
    app.use(
      ['/docs'],
      expressBasicAuth({
        challenge: true,
        users: { [process.env.SWAGGER_USER]: process.env.SWAGGER_PWD },
      }),
    );
  }

  const config = new DocumentBuilder()
    .addBearerAuth()
    .setTitle('광부왕')
    .setDescription('king-of-mine-worker-back Api')
    .setVersion(process.env.VERSION)
    .build();

  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('docs', app, document);
  await app.listen(process.env.PORT);
}
bootstrap();
728x90
반응형