typescript - 在nestjs中具有嵌套对象数组的类验证器

标签 typescript nestjs dto class-validator

我正在尝试验证 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包含验证逻辑的装饰器 + @Type来自 class-transformer 的装饰师模块。

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 .

关于typescript - 在nestjs中具有嵌套对象数组的类验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60334856/

相关文章:

sql-server - 使用 Sequelize 从现有的 SQL Server 数据库在 Nest js 中自动生成模型

node.js - 在本地运行 firebase 功能时如何使 https 工作并添加自签名 SSL 证书?

c# - 在 C# 中克隆 DTO

validation - 如何检测相应 DTO 中未引用的查询参数的使用?

javascript - 延迟加载模块可以使用 root 注入(inject)的 canActivate 防护吗?

typescript - 如何使用 typescript 声明特定长度的字符串?

javascript - NextJS中如何读取FormData

node.js - 带有 MongoDB 和 NestJsxAutomapper 的 NestJS 导致错误 'cannot read property plugin of undefined'

java - 我应该在哪里存储微服务的外部客户端 DTO?

angular - 如何在 Angular 中定位 Position MatSnackBar 模块?