JS/Nest.js

[Nest JS] 커스텀 파이프 구현 => 유효성 체크

Mini_96 2024. 8. 17. 21:16

* 구현

import { ArgumentMetadata, PipeTransform } from "@nestjs/common";

export class BoardStatusValidationPipe implements PipeTransform{
  transform(value: any, metadata: ArgumentMetadata): any {
    console.log('val',value);
    console.log('meta data', metadata);
    return value;
  }
}

컨트롤러에서

매개변수 검사용 파이프라인을 넣으면됨.

@Patch('/:id/status') //수정은 patch
updateBoardStatus(@Param('id')id:string, @Body('status', BoardStatusValidationPipe) status:BoardStatus){
  return this.boardsService.updateBoardStatus(id,status);
}

 

 

 

* value, metadata가 무엇인가?

patch 실행

value : dfgdfs

metadata : [function: String] , type : body , data : status

 

* 문제 : 상태는 private, public 만 와야함

 

readonly => get만 가능

* 해결 : 커스텀 파이프 구현

import { ArgumentMetadata, BadRequestException, PipeTransform } from "@nestjs/common";
import { BoardStatus } from "../board.model";

export class BoardStatusValidationPipe implements PipeTransform{
  transform(value: any, metadata: ArgumentMetadata): any {
    value = value.toUpperCase();
    if(!this.isStatusValid(value)){
      throw new BadRequestException('${value} isn`t in the status options');
    }
    return value;
  }

  //get 전용 멤버변수
  readonly StatusOptions=[
    BoardStatus.PUBLIC,
    BoardStatus.PRIVATE
  ];


  private isStatusValid(status: any) {
    const index = this.StatusOptions.indexOf(status);
    return index !== -1 ;
  }
}

유효하지 않은 경우
정상입력