【问题标题】:Class validator with array of nested objects in nestjs在nestjs中具有嵌套对象数组的类验证器
【发布时间】:2020-06-05 15:49:33
【问题描述】:

我正在尝试验证 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

【问题讨论】:

  • 欢迎加入社区,请与我们分享您的 class-validator && nestjs 版本。
  • 谢谢!更新。 NestJS:6.10.14 类验证器:0.11.0
  • ValidateNested() 不适用于自定义对象

标签: typescript nestjs dto class-validator


【解决方案1】:

到目前为止,在 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;
}

那么我们可以简单地用它来定义like:

@IsArrayOfObjects()
@ValidateNested()
@Type(() => NestedDTO)
nested: NestedDTO[];

但是,此解决方案将允许传递空数组。然后您可以在IsArrayOfObjects 中添加额外的条件,例如value.length > 0,并更正其defaultMessage

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 2019-05-16
    • 2021-05-05
    • 2021-03-09
    • 2020-06-04
    • 2022-01-05
    • 2022-08-09
    • 2019-05-08
    相关资源
    最近更新 更多