Validation

Validation

유효성 검사는 모든 웹 응용 프로그램에 필수적인 기능입니다. 들어오는 요청을 자동으로 확인하기 위해 내장된 ValidationPipe가 사용하는 class-validator 패키지를 활용합니다. ValidationPipe는 다양한 강력한 유효성 검사 규칙을 사용하여 들어오는 클라이언트 페이로드를 확인하는 편리한 방법을 제공합니다.

Overview

파이프 장에서 우리는 단순화된 검증 파이프를 만드는 과정을 거쳤습니다. 우리가 수행하는 작업을 더 잘 이해하려면 이 기사를 읽는 것이 좋습니다. 여기서는 주로 실제 사용 사례에 중점을 둘 것입니다.

Auto-validation

이 자습서를 위해 ValidationPipe를 전체 응용 프로그램에 바인딩하므로 모든 엔드포인트가 잘못된 데이터로부터 자동으로 보호됩니다.

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

파이프를 테스트하기 위해 기본 엔드포인트를 만들어 봅시다.

@Post()
create(@Body() createUserDto: CreateUserDto) {
  return 'This action adds a new user';
}

그런 다음 CreateUserDto에 몇 가지 유효성 검사 규칙을 추가하십시오.

import { IsEmail, IsNotEmpty } from 'class-validator';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsNotEmpty()
  password: string;
}

이제 누군가가 유효하지 않은 email로 엔드 포인트를 요청하면 애플리케이션은 400 Bad Request코드와 다음 응답 본문으로 응답합니다.

{
  "statusCode": 400,
  "error": "Bad Request",
  "message": [
    {
      "target": {},
      "property": "email",
      "children": [],
      "constraints": {
        "isEmail": "email must be an email"
      }
    }
  ]
}

분명히 응답 본문은 ValidationPipe의 유일한 사용 사례가 아닙니다. 엔드 포인트 경로에서 :id를 받고 싶다고 상상해 보십시오. 그래도 숫자만 유효합니다. 이것은 매우 간단합니다.

@Get(':id')
findOne(@Param() params: FindOneParams) {
  return 'This action returns a user';
}

그리고 FindOneParams는 다음과 같습니다.

import { IsNumberString } from 'class-validator';

export class FindOneParams {
  @IsNumberString()
  id: number;
}

Disable detailed errors

오류 메시지는 네트워크를 통해 전송된 데이터의 문제점을 이해하는 데 많은 도움이 됩니다. 그러나 일부 프로덕션 환경에서는 자세한 오류를 사용하지 않을 수 있습니다.

app.useGlobalPipes(
  new ValidationPipe({
    disableErrorMessages: true,
  }),
);

이제 최종 사용자에게 오류 메시지가 채워지지 않습니다.

Stripping properties

종종 미리 정의 된 (허용 된) 속성만 전달하고 싶습니다. 예를 들어, 우리가 emailpassword 속성을 기대한다면 누군가가 age를 보낼 때 이 속성은 제거되어 DTO에서 사용할 수 없게 됩니다. 이러한 동작을 가능하게하려면whitelisttrue로 설정하십시오.

app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true,
  }),
);

이 설정은 화이트리스트에 포함되지 않은 (데코레이터없이) 속성의 자동 제거를 활성화합니다. 그러나 요청 처리를 완전히 중지하고 사용자에게 오류 응답을 반환하려면 whitelist와 함께 forbidNonWhitelisted를 사용하십시오.

Auto payload transforming

ValidationPipe는 페이로드를 해당 DTO 클래스로 자동 변환하지 않습니다. 컨트롤러 메소드에서 createUserDto 또는 findOneParams를 살펴보면 실제 클래스가 아니라는 것을 알 수 있습니다. 자동 변환을 활성화하려면transformtrue로 설정하십시오.

app.useGlobalPipes(
  new ValidationPipe({
    transform: true,
  }),
);

Websockets & Microservices

이러한 모든 지침은 사용중인 전송 방법에 관계없이 WebSocket과 마이크로 서비스를 모두 고려했습니다.

Learn more

사용자 지정 유효성 검사기, 오류 메시지 및 사용 가능한 데코레이터에 대한 자세한 내용을 보려면 이 페이지를 방문하십시오.

Last updated