web-dev-qa-db-fra.com

Class-validator - valide le tableau d'objets

J'utilise un package de validation de classe avec NestJS et je cherche à valider un tableau d'objets qui doivent avoir exactement 2 objets avec la même disposition:

Jusqu'à présent, j'ai:

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

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

  @IsString()
  type: string;

  @IsString()
  value: string;
}

et

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

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

par réponse @kamilg (je suis en mesure d'appliquer exactement 2 éléments):

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[];
}

Je peux toujours passer un tableau vide ou un tableau avec d'autres objets non liés à AuthParam.

Comment dois-je le modifier pour obtenir la validation?

Aussi comment puis-je appliquer 2 éléments obligatoires dans le tableau? MinLength (2) semble concerner la chaîne ... (résolu)

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])
})

Cela fonctionne correctement, c'est:

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

donc je peux seulement supposer que l'objet qui est en cours de validation, n'est pas une instance de AuthParam

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

comme prévu, il n'y a pas de décorateurs sur cet objet (ce qui peut être vrai pour les contrôleurs Nest.js et les objets imbriqués de body/req) - la validation est donc ignorée.

Veuillez vérifier ceci (tl; dr - @Type formulaire décorateur class-transformer)

1
kamilg

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

Vient de paraître dans v0.10.2, donc ça devrait aider, j'espère!

0
kamilg