Class nestjs 中带有嵌套对象数组的验证器
Class validator with array of nested objects in nestjs
我正在尝试验证 nestjs 中的嵌套对象数组,它工作正常。但是,如果我发送非数组值,如字符串或 null,则会出现错误:
TypeError: Cannot read property 'length' of undefined.
嵌套字段:
@IsArray()
@ValidateNested({ each: true })
@Type(() => NestedDTO)
nested: NestedDTO[];
如何在验证嵌套对象之前验证值是一个数组?
版本:
NestJS: 6.10.14
class-validator: 0.11.0
到目前为止,NestJS 中还缺乏对对象数组验证的开箱即用支持。
请看我的解决方案:
要点是编写然后使用自定义 IsArrayOfObjects
装饰器,它将包含验证逻辑 + 来自 class-transformer
模块的 @Type
装饰器。
import { Type } from 'class-transformer';
import {
IsString,
registerDecorator,
ValidateNested,
ValidationArguments,
ValidationOptions,
} from 'class-validator';
export function IsArrayOfObjects(validationOptions?: ValidationOptions) {
return (object: unknown, propertyName: string) => {
registerDecorator({
name: 'IsArrayOfObjects',
target: object.constructor,
propertyName,
constraints: [],
options: validationOptions,
validator: {
validate(value: any): boolean {
return (
Array.isArray(value) &&
value.every(
(element: any) =>
element instanceof Object && !(element instanceof Array),
)
);
},
defaultMessage: (validationArguments?: ValidationArguments): string =>
`${validationArguments.property} must be an array of objects`,
},
});
};
}
假设我们有这个 NestedDTO
:
export class NestedDTO {
@IsString()
someProperty: string;
}
然后我们可以简单地使用它来定义:
@IsArrayOfObjects()
@ValidateNested()
@Type(() => NestedDTO)
nested: NestedDTO[];
但是,此解决方案将允许传递空数组。然后你可以在 IsArrayOfObjects
中添加额外的条件,如 value.length > 0
并更正其 defaultMessage
.
我正在尝试验证 nestjs 中的嵌套对象数组,它工作正常。但是,如果我发送非数组值,如字符串或 null,则会出现错误:
TypeError: Cannot read property 'length' of undefined.
嵌套字段:
@IsArray()
@ValidateNested({ each: true })
@Type(() => NestedDTO)
nested: NestedDTO[];
如何在验证嵌套对象之前验证值是一个数组?
版本:
NestJS: 6.10.14
class-validator: 0.11.0
到目前为止,NestJS 中还缺乏对对象数组验证的开箱即用支持。
请看我的解决方案:
要点是编写然后使用自定义 IsArrayOfObjects
装饰器,它将包含验证逻辑 + 来自 class-transformer
模块的 @Type
装饰器。
import { Type } from 'class-transformer';
import {
IsString,
registerDecorator,
ValidateNested,
ValidationArguments,
ValidationOptions,
} from 'class-validator';
export function IsArrayOfObjects(validationOptions?: ValidationOptions) {
return (object: unknown, propertyName: string) => {
registerDecorator({
name: 'IsArrayOfObjects',
target: object.constructor,
propertyName,
constraints: [],
options: validationOptions,
validator: {
validate(value: any): boolean {
return (
Array.isArray(value) &&
value.every(
(element: any) =>
element instanceof Object && !(element instanceof Array),
)
);
},
defaultMessage: (validationArguments?: ValidationArguments): string =>
`${validationArguments.property} must be an array of objects`,
},
});
};
}
假设我们有这个 NestedDTO
:
export class NestedDTO {
@IsString()
someProperty: string;
}
然后我们可以简单地使用它来定义:
@IsArrayOfObjects()
@ValidateNested()
@Type(() => NestedDTO)
nested: NestedDTO[];
但是,此解决方案将允许传递空数组。然后你可以在 IsArrayOfObjects
中添加额外的条件,如 value.length > 0
并更正其 defaultMessage
.