Class-validator - проверять массив объектов - PullRequest
2 голосов
/ 11 октября 2019

Я использую пакет class-validator с NestJS, и я ищу, чтобы проверить массив объектов, которые должны иметь ровно 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) похоже на строку ... (решено)

Ответы [ 4 ]

3 голосов
/ 13 октября 2019

Добавьте @Type(() => AuthParam) к вашему массиву, и он должен работать. Type декоратор необходим для вложенных объектов (массивов). Ваш код становится

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

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

Будьте осторожны, если вы используете какой-либо фильтр исключений для изменения ответа на ошибку. Убедитесь, что вы понимаете структуру ошибок класса-валидатора.

2 голосов
/ 11 октября 2019

Вы можете использовать следующее:

validator.arrayNotEmpty(array); // Checks if given array is not empty.

validator.arrayMinSize(array, min); // Checks if array's length is at least `min` number.

(https://github.com/typestack/class-validator#manual-validation)

Возможно, вы захотите написать на заказвалидатор, который лучше отражает ваши бизнес-требования.

1 голос
/ 11 октября 2019

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)

0 голосов
/ 14 октября 2019

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

Был только что опубликован в v0.10.2, так что это должно помочь, надеюсь!

...