NestJS에서 HTTP 예외를 사용자 정의하는 방법

프로젝트가 강력하게 진행되어 질 때 마다, 코드의 복제성이 질 때마다, 실제 데이터가 증거Q 때마다, 서버는 완전하게 조작하게 행동해야 하고, 그 반응도 통일성이 있어야 한다고 생각한다.

응답은 당연합니다. 에서 응답과 오류를 잘 처리하여 논리를 처리하려면 서버에서는 항상 표준화된 형태의 객체로 응답/오류를 전해주어야 합니다.

현재 진행 중인 프로젝트에서는 다음과 같은 수신 양식을 지켜보고 있습니다. 읽기가 난다면 다음과 같은 형식으로 내려간다.

{
  "status" : 401, // Http Status Code
  "code" : "UNAUTHORIZED_USER" // string Response code
  "error" : true // is error occurred?
  "message" : "권한이 없습니다." // message for request,
  "data" : // response data, original error object
}


하지만, NestJS의 기능 중에는 다음과 같은 기능이 존재한다.

export class SomethingDto {
  @IsNotEmpty()
  field : number
}


를 사용한 Validation과,

throw new UnauthorizedException(object, 'description');


과 같은 NestJS가 지원하는 HttpException 이다.

비슷한 기능을 사용하면서 NestJS가 자동으로 던지는 응답(에러)객체는 다음과 같이 된다

{
  "statusCode" : HttpStatusCode,
  "message" : string[],
  "error" : string
}


따라서 프로젝트에서 사용하는 형식으로 응답을 반환해야 합니다.

사용하는 것이 처리 레이어를 두 가지 방식으로 하고 필터를 사용한다. 다음은 내가 사용한 방식이다.
광고가 가능하다면 언제든지 점을 가리키면 감사드린다.
  • http-예외.filter.ts

  • @Catch()
    export class HttpExceptionFilter implements ExceptionFilter {
      catch(exception: Error, host: ArgumentsHost) {
        const ctx = host.switchToHttp();
        const res = ctx.getResponse<Response>();
        const req = ctx.getRequest<Request>();
      }
    
        if(!(exception instanceof HttpException)) {
          exception = new HttpException(new ResponseDto(~~),     
          HttpStatus.Internal_Server_Error);
        }
    
        let response = (exception as HttpException).getResponse();
    
        // 시스템이 자동으로 던진 에러에는 statusCode가 존재함.
        if(response['statusCode']) {
          // your transform response object
        }
    
        const log = {
          timeStamp: new Date();
          url: req.url;
          response
        };
    
        Logger.error(long)
    
        res.status((exception as 
        HttpException).getStatus()).json(response);
    }
    

    이렇게 이전에 main.ts에서 다음과 같이 사용했다.

    // 중략
    
    app.useGlobalFilters(new HttpExceptionFilter());
    await app.listen(8080);
    
    // 후략
    


    이렇게 다음과 같이 근접한 시스템에서 던진 기계메세지에 잘 변형되어 내려왔습니다.



    우회적으로 헤메이는 바로에게 힘이 되었으면 합니다.

    참조
  • https://wikidocs.net/158651
  • 좋은 웹페이지 즐겨찾기