[NestJS] 빌트인 ParseUUIDPipe에서 커스텀 메세지 전달하기

cabbage·2023년 11월 4일
0

NestJS

목록 보기
16/17
post-thumbnail

빌트인 ParseUUIDPipe를 사용하면 다음과 같은 에러 메세지(message 필드)를 확인할 수 있다.

{
    "success": false,
    "statusCode": 400,
    "error": "Bad Request",
    "message": "Validation failed (uuid is expected)",
    "timestamp": "2023-10-31T15:46:16.522Z",
    "path": "/restaurants/1"
}

여기서 message 필드에는 빌트인 ParseUUIDPipe가 반환하는 에러 메세지가 들어가는데, 이 에러 메세지를 좀 더 클라이언트 친화적으로? 전달하고 싶었다.

구글링 결과 스택오버플로우에서 해결법을 찾을 수 있었다.

import { ArgumentMetadata, ParseUUIDPipe } from '@nestjs/common';

export class CustomParseUUIDPipe extends ParseUUIDPipe {
	async transform(value: string, metadata: ArgumentMetadata): Promise<string> {
		try {
			return await super.transform(value, metadata);
		} catch {
			throw this.exceptionFactory('잘못된 id 형식입니다.');
		}
	}
}
  • ParseUUIDPipe를 상속하는 클래스를 만든다.
  • transform 메서드를 구현해야 한다.
    • try 내부에서 ParseUUIDPipe의 transform 메서드를 사용해 클라이언트에서 전달받은 값이 uuid 형식인지 유효성 검사를 진행한다.
    • 만약 유효성 검사가 실패하면 catch 내부에서 ParseUUIDPipe가 제공하는 exceptionFactory에 전달하고 싶은 메세지를 전달한다.
    • exceptionFactory 메서드는 string 타입의 에러 메세지를 받는다.

이제 path 파라미터 id에 CustomParseUUIDPipe를 적용한다.

@Get(':id')
findOne(@Param('id', CustomParseUUIDPipe) id: string): Promise<Restaurant> {
	return this.restaurantsService.findOne(id);
}

요청을 보내 결과를 확인한다.

{
    "success": false,
    "statusCode": 400,
    "error": "Bad Request",
    "message": "잘못된 id 형식입니다.",
    "timestamp": "2023-10-31T15:52:09.291Z",
    "path": "/restaurants/1"
}
  • exceptionFactory에서 전달했던 에러 메세지를 message에서 확인할 수 있다.

현재 개발자가 원하는 메세지를 전달할 수 있는 기능이 nestjs 레포지토리에 pr된 상태라고 한다. 문제 없다면 이후 버전에서 커스텀 메세지를 전달할 수 있는 기능이 추가될 수도 있을 것 같다.

참고링크

profile
캐비지 개발 블로그입니다. :)

0개의 댓글