带嵌套对象数组的类验证器在nestjs中 [英] Class validator with array of nested objects in nestjs

查看:135
本文介绍了带嵌套对象数组的类验证器在nestjs中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试验证nestjs中的嵌套对象数组,并且工作正常.但是,如果我发送非字符串值(例如字符串或null),则会收到错误消息:

I'm trying to validate array of nested objects in nestjs and it works fine. But if I send non-array value like string or null, then I get an error:

TypeError:无法读取未定义的属性"length".

嵌套字段:

@IsArray()
@ValidateNested({ each: true })
@Type(() => NestedDTO)
nested: NestedDTO[];

在验证嵌套对象之前,如何验证该值是一个数组?

How can I validate that value is an array before validate nested objects?

版本:

NestJS: 6.10.14
class-validator: 0.11.0

推荐答案

到目前为止,NestJS缺乏对对象数组验证的开箱即用支持.

Out-of-the-box support for validation of array of objects is kind of scarce in NestJS so far.

请看看我的解决方案:

主要要点是编写然后使用自定义的 IsArrayOfObjects 装饰器,该装饰器将包含 class-transformer 的验证逻辑+ @Type 装饰器模块.

The main point is to write and then to use your custom IsArrayOfObjects decorator that will contain the validation logic + @Type decorator from class-transformer module.

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

然后我们可以简单地用它来定义:

Then we can simply use it for defining like:

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

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

However, this solution will allow empty array to be passed. Then you can add extra condition in IsArrayOfObjects like value.length > 0 and also correct its defaultMessage.

这篇关于带嵌套对象数组的类验证器在nestjs中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆