web-dev-qa-db-ja.com

Class-validator-オブジェクトの配列を検証する

私はNestJSでclass-validatorパッケージを使用しており、同じレイアウトで正確に2つのオブジェクトが必要なオブジェクトの配列を検証しようとしています。

これまでのところ:

import { IsString, IsNumber } from 'class-validator';

export class AuthParam {
  @IsNumber()
  id: number;

  @IsString()
  type: string;

  @IsString()
  value: string;
}

そして

import { IsArray, ValidateNested } from 'class-validator';
import { AuthParam } from './authParam.model';

export class SignIn {
  @IsArray()
  @ValidateNested({ each: true })
  authParameters: AuthParam[];
}

@kamilg応答ごと(私は正確に2つの要素を強制することができます):

import { IsArray, ValidateNested, ArrayMinSize, ArrayMaxSize } from 'class-validator';
import { AuthParam } from './authParam.model';

export class SignInModel {
  @IsArray()
  @ValidateNested({ each: true })
  @ArrayMinSize(2)
  @ArrayMaxSize(2)
  authParameters: AuthParam[];
}

空の配列またはAuthParamに関連しない他のいくつかのオブジェクトを含む配列を渡すことができます。

検証を受けるにはどうすれば変更できますか?

また、配列に必須の2つの要素を強制するにはどうすればよいですか? MinLength(2)は文字列に関するようです...(解決済み)

6
bensiu

const param1: AuthParam = Object.assign(new AuthParam(), {
  id: 1,
  type: 'grant',
  value: 'password'
})

const param2: AuthParam = Object.assign(new AuthParam(), {
  id: 1,
  type: 4,
  value: 'password'
})

const signInTest = new SignInModel()
signInTest.authParameters = [param1, param2]

validate(signInTest).then(e => {
  console.log(e[0].children[0].children[0])
})

これは正しく動作します。これは次のとおりです。

ValidationError {
  target: AuthParam { id: 1, type: 4, value: 'password' },
  value: 4,
  property: 'type',
  children: [],
  constraints: { isString: 'type must be a string' } }

だから私は検証されているオブジェクトがAuthParamインスタンスではないと仮定するかもしれません

const param2: AuthParam = {
  id: 1,
  type: 4,
  value: 'password'
} as any

予想通り、このオブジェクトにはデコレーターがありません(これはNest.jsコントローラーとbody/reqのネストされたオブジェクトに当てはまる可能性があります)-検証は無視されます。

確認してください this (tl; dr-@Typeデコレータフォームclass-transformer

1
kamilg

https://github.com/typestack/class-validator/pull/295

v0.10.2、それで、うまくいけば、役立つはずです!

0
kamilg