Class-validator - 验证对象数组
Class-validator - validate array of objects
我正在将 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) 似乎与字符串有关...(已解决)
您可以使用以下内容:
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)
您可能需要考虑编写自定义验证程序,这将更好地反映您的业务需求。
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
)
将 @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[];
}
如果您使用任何异常过滤器来修改错误响应,请小心。确保您了解 class-验证器错误的结构。
我知道我迟到了,但遇到一些字体问题,然后尝试另一种方法来实现它:
export class AuthParam {
@IsNumber()
id: number;
@IsString()
type: string;
@IsString()
value: string;
}
Validation function
@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[];
}
也许它会对某人有所帮助
我正在将 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) 似乎与字符串有关...(已解决)
您可以使用以下内容:
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)
您可能需要考虑编写自定义验证程序,这将更好地反映您的业务需求。
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
)
将 @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[];
}
如果您使用任何异常过滤器来修改错误响应,请小心。确保您了解 class-验证器错误的结构。
我知道我迟到了,但遇到一些字体问题,然后尝试另一种方法来实现它:
export class AuthParam {
@IsNumber()
id: number;
@IsString()
type: string;
@IsString()
value: string;
}
Validation function
@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[];
}
也许它会对某人有所帮助