빈 값이 들어왔을 때
app.useGlobalpipe(ValidationPipes)
Dto class 내 속성에 @IsNotEmpty() 데코레이터 사용
존재하지 않는 게시물일 때
error 인스턴스 생성
throw new NotFoundException('에러 메시지')
예를 들어 게시물의 상태(status)를 변경할 때 유효성을 체크하는 커스텀 파이프를 만든다고 하자.
(게시물의 상태는 공개(public) 또는 비공개(private) 2가지 타입만 있어야 한다. 만약 다른 타입으로 변경하려고 하면 에러를 발생시키는 파이프를 만드는 것이 목표다.)
export class boardStatusValidationPipe implements PipeTransfrom {}
해당 클래스 안에는 transform()
메서드를 반드시 포함해야 한다.
transform()
메서드 안에는 value, metadata 두 인자가 들어간다.
value는 처리될 값, 즉 입력 받은 status 값이다.
metadata는 이 값에 대한 메타 데이터가 들어 있다.
transform()
메서드를 통해서 입력 받은 값 value를 검사하고 만약 올바르지 않은 값이면 BadRequestException
에러를 던진다.
올바른 값이면 그 값을 return 하면 된다.
여기서 중요한 것은 올바르지 않은 값을 검사하는 함수를 추가해주는 것이다. 먼저 statusOptions
라는 배열에 public
과 private
을 담아놓는다. 그리고 만약 받은 값이 없다면 indexOf() 배열 메서드를 사용했을 때 -1 값이 반환될 것이다. (반대로 하면 값이 있다면 -1 값이 아닌 0이나 1 값이 반환될 것이다.)
이 로직을 코드로 작성하면 다음과 같다.
import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
import { BoardStatus } from 'src/board/board.model';
@Injectable()
export class BoardStatusValidationPipe implements PipeTransform {
readonly StatusOptions = [BoardStatus.PRIVATE, BoardStatus.PUBLIC];
transform(value) {
value = value.toUpperCase();
if (!this.isStatusValidate(value)) {
throw new BadRequestException(`${value} isn't in the status options`);
}
return value;
}
private isStatusValidate(status) {
const indexOfStatus = this.StatusOptions.indexOf(status);
return indexOfStatus !== -1;
}
}
마지막으로 controller에서 status를 받는 부분 @Body의 인자에 해당 파이프(BoardStatusValidationPipe
)를 심어주면 된다.
@Put('/:id/status')
updateBoardStatus(
@Param('id') id: string,
@Body('status', BoardStatusValidationPipe) status: BoardStatus,
) {
return this.boardsService.updateBoardStatus(id, status);
}