typescript - Class-validator - validera en array av objekt
Jag använder class-validator-paketet med NestJS och jag vill validera en array av objekt som behöver ha exakt 2 objekt med samma layout:
Hittills har jag:
import { IsString, IsNumber } from 'class-validator';
export class AuthParam {
@IsNumber()
id: number;
@IsString()
type: string;
@IsString()
value: string;
}
och
import { IsArray, ValidateNested } from 'class-validator';
import { AuthParam } from './authParam.model';
export class SignIn {
@IsArray()
@ValidateNested({ each: true })
authParameters: AuthParam[];
}
enligt @kamilg:s svar (jag kan upprätthålla exakt 2 element):
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[];
}
Jag kan fortfarande skicka en tom array eller en array med några andra objekt som inte är relaterade till AuthParam.
Hur ska jag ändra det för att få validering?
Också hur kan jag tvinga fram obligatoriska 2 element i arrayen? MinLength(2) verkar gälla sträng... (löste)
Svar #1
Lägg till @Type(() => AuthParam) i din array och det bör fungera. Type-dekorationen krävs för nästlade objekt (arrayer). Din kod blir
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[];
}
Var försiktig om du använder någon undantagsfilter för att ändra felresponser. Se till att du förstår strukturen för class-validator-felen.
Svar #2
Jag vet att jag är sen men stöter på några problem med typen, försök sedan ett annat sätt att implementera detta:
export class AuthParam {
@IsNumber()
id: number;
@IsString()
type: string;
@IsString()
value: string;
}
Valideringsfunktion
@ValidatorConstraint()
export class IsAuthArray implements ValidatorConstraintInterface {
public async validate(authData: AuthParam[], args: ValidationArguments) {
return Array.isArray(authData) && authData.reduce((a, b) => a && (typeof b.id === "number") && typeof b.type === "string" && typeof b.field === "string", true);
}
}
export class SignInModel {
@IsNotEmpty()
@IsArray()
@ArrayMinSize(2)
@ArrayMaxSize(2)
@Validate(IsAuthArray, {
message: "Enter valid value .",
})
authParameters: AuthParam[];
}
Kanske det hjälper någon 😃
