Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Class-validator - validate array of objects

I am using class-validator package with NestJS and I am looking to validate an array of objects that need to have exactly 2 objects with the same layout:

So far I have:

import { IsString, IsNumber } from 'class-validator';  export class AuthParam {   @IsNumber()   id: number;    @IsString()   type: string;    @IsString()   value: string; } 

and

import { IsArray, ValidateNested } from 'class-validator'; import { AuthParam } from './authParam.model';  export class SignIn {   @IsArray()   @ValidateNested({ each: true })   authParameters: AuthParam[]; } 

per @kamilg response (I am able to enforce exacly 2 elements):

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

I still can pass an empty array or an array with some other objects not related to AuthParam.

How I should modify it get validation?

Also how I can enforce mandatory 2 elements in the array? MinLength(2) seems to be regarding string... (resolved)

like image 234
bensiu Avatar asked Oct 11 '19 14:10

bensiu


2 Answers

Add @Type(() => AuthParam) to your array and it should be working. Type decorator is required for nested objects(arrays). Your code becomes

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

Be careful if you are using any exception filter to modify the error reponse. Make sure you understand the structure of the class-validator errors.

like image 169
Yousef khan Avatar answered Sep 21 '22 19:09

Yousef khan


You can use the following:

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)

You may want to consider writing custom validator which would better reflect the business requirement you have.

like image 41
kamilg Avatar answered Sep 20 '22 19:09

kamilg