[NestJS] Validation


いつ使いますか.
エラーコントロールcreate-user.dto.ts
export class JoinRequestDto {
  readonly email: string;
  readonly nickname: string;
  readonly password: string;
}
user.controller.ts
@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}
  
  ...
  
  @Post()
  create(@Body() joinRequestDto: JoinRequestDto) {
    return this.userService.create(joinRequestDto);
  }
}
🙅‍♀️タイプが定義したタイプに合わない場合、または必要に応じてrequestにいない場合は、各タイプをエラー処理できます.
if (!email) {
	throw new BadRequestException('이메일이 없네요');
}
if (!nickname) {
	throw new BadRequestException('닉네임이 없네요');
}
if (!password) {
	throw new BadRequestException('비밀번호이 없네요');
}
🙆‍♀️Nestは自動検証機能を提供します.
import { IsNotEmpty } from 'class-validator';

export class JoinRequestDto {
  @IsNotEmpty()
  email: string;

  @IsNotEmpty()
  nickname: string;

  @IsNotEmpty()
  password: string;
}
responseが表示されると、エラーメッセージがクライアントに自動的に送信されます.
{
  "statusCode": 400,
  "error": "Bad Request",
  "message": ["email should not be empty",
	      "nickname should not be empty",
	      "password should not be empty"
	]
}
せいけいかん
🙆‍♀️ 検証と同時にarrayに変換して使用できます.
@Get()
findByIds(
  @Query('ids', new ParseArrayPipe({ items: Number, separator: ',' }))
  ids: number[],
) {
  return 'This action returns users by ids';
}
役に立ちすぎたでしょう?じゃ、よく勉強しましょう.😀
Validation
  • Webアプリケーションに送信されるデータの正確性を検証することが望ましい.
  • 自動検証
  • の要求を受信するために、Nestは、直ちに利用可能な複数のパイプを提供する.
  • ValidationPipe
  • ParseIntPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseUUIDPipe
  • ValidationPipe(暗黙的な変換)
    インストールの依存関係
    $ npm i --save class-validator class-transformer
    組み込みオプション
    export interface ValidationPipeOptions extends ValidatorOptions {
      transform?: boolean;
      // true로 설정하면 유효성 검사 오류가 클라이언트에 반환되지 않습니다.
      disableErrorMessages?: boolean;
      // 유효성 검사 오류의 배열을 가져오고 throw할 예외 개체를 반환합니다.
      exceptionFactory?: (errors: ValidationError[]) => any; 
     
    }
    📢 この他にも複数選択があります.
    Auto-validation
  • アプリケーションレベルでValidationPipeがバインドされ、すべてのエンドポイントに適用されます.main.ts
  • async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      app.useGlobalPipes(new ValidationPipe());
      await app.listen(3000);
    }
    bootstrap();
  • デコーダを使用して、検証ルールを追加
  • import { IsEmail, IsNotEmpty } from 'class-validator';
    
    export class JoinRequestDto {
      @IsNotEmpty()
      @IsEmail()
      email: string;
    
      @IsNotEmpty()
      nickname: string;
    
      @IsNotEmpty()
      password: string;
    }
  • エンドポイントに達すると、アプリケーションは400 Bad Requestコードに自動的に応答し、以下の応答本文を含む.
  • {
      "statusCode": 400,
      "error": "Bad Request",
      "message": ["email must be an email"]
    }
    📢 この他にも複数の検証ルールがあります.
    他のリクエスト・オブジェクトとの使用
    import { IsNumberString } from 'class-validator';
    
    export class FindOneParams {
      @IsNumberString()
      id: number;
    }
    @Get(':id')
    findOne(@Param() params: FindOneParams) {
      return 'This action returns a user';
    }
    形状の自動変換
  • メソッドレベルの
  • @Post()
    @UsePipes(new ValidationPipe({ transform: true }))
    async create(@Body() createCatDto: CreateCatDto) {
      this.catsService.create(createCatDto);
    }
  • グローバルアクティブ
  • のデフォルトでは、すべてのパスパラメータとクエリーパラメータは、ネットワークを介してstringとして提供されますが、numberとして指定されている場合は、ValidationPipeによって自動的に変換されます.
  • app.useGlobalPipes(
      new ValidationPipe({
        transform: true,
      }),
    );
    Parse*Pipe(明示的な変換)
  • (自動変換を無効にする)では、ParseIntPipeまたはParseBoolPipeを使用して値を明示的に鋳造できます.
  • @Get(':id')
    findOne(
      @Param('id', ParseIntPipe) id: number,
      @Query('sort', ParseBoolPipe) sort: boolean,
    ) {
      console.log(typeof id === 'number'); // true
      console.log(typeof sort === 'boolean'); // true
      return 'This action returns a user';
    }
    シナリオの検証
    @Get()
    findByIds(
      @Query('ids', new ParseArrayPipe({ items: Number, separator: ',' }))
      ids: number[],
    ) {
      return 'This action returns users by ids';
    }
  • HTTP GETリクエストに入力されたクエリー・パラメータの有効性を確認します.
  • GET /?ids=1,2,3