我想使用嵌套中的类验证器来验证body负载.js控制器.我的currency.dto.ts文件是这样的:

import {
  IsNotEmpty,
  IsString,
  ValidateNested,
  IsNumber,
  IsDefined,
} from 'class-validator';

class Data {

  @IsNotEmpty()
  @IsString()
  type: string;

  @IsNotEmpty()
  @IsNumber()
  id: number;
}

export class CurrencyDTO {
  @ValidateNested({ each: true })
  @IsDefined()
  data: Data[];
}

在我的窝里.js控制器,我是这样使用的.

  @Post()
  @UseGuards(new AuthTokenGuard())
  @UsePipes(new ValidationPipe())
  addNewCurrency(@Req() req, @Body() data: CurrencyDTO) {
    console.log('data', data);
  }

我的验证管道类如下所示:

import {
  PipeTransform,
  Injectable,
  ArgumentMetadata,
  BadRequestException,
  HttpException,
  HttpStatus,
} from '@nestjs/common';
import { validate, IsInstance } from 'class-validator';
import { plainToClass, Exclude } from 'class-transformer';

@Injectable()
export class ValidationPipe implements PipeTransform<any> {
  async transform(value: any, metadata: ArgumentMetadata) {
    if (value instanceof Object && this.isEmpty(value)) {
      throw new HttpException(
        `Validation failed: No Body provided`,
        HttpStatus.BAD_REQUEST,
      );
    }
    const { metatype } = metadata;
    if (!metatype || !this.toValidate(metatype)) {
      return value;
    }
    const object = plainToClass(metatype, value);
    const errorsList = await validate(object);
    if (errorsList.length > 0) {
      const errors = [];
      for (const error of errorsList) {
        const errorsObject = error.constraints;
        const { isNotEmpty } = errorsObject;
        if (isNotEmpty) {
          const parameter = isNotEmpty.split(' ')[0];
          errors.push({
            title: `The ${parameter} parameter is required.`,
            parameter: `${parameter}`,
          });
        }
      }
      if (errors.length > 0) {
        throw new HttpException({ errors }, HttpStatus.BAD_REQUEST);
      }
    }
    return value;
  }

  private toValidate(metatype): boolean {
    const types = [String, Boolean, Number, Array, Object];
    return !types.find(type => metatype === type);
  }
  private isEmpty(value: any) {
    if (Object.keys(value).length > 0) {
      return false;
    }
    return true;
  }
}

此验证管道适用于除嵌套对象之外的所有对象.知道我做错了什么吗?

{
"data": [{
    "id": 1,
    "type": "a"
}]
}

推荐答案

try 使用@Type指定嵌套类型:

import { Type } from 'class-transformer';

export class CurrencyDTO {
  @ValidateNested({ each: true })
  @Type(() => Data)
  data: Data[];
}

要验证嵌套类型,它需要是类的实例,而不仅仅是普通数据对象.使用@Type decorator,当在VaildationPipe中调用plainToClass时,您会告诉class transformer为给定属性实例化一个类.

如果您使用的是内置ValidationPipe,请确保已设置选项transform: true.

Typescript相关问答推荐

具有实体的ngrx SignalStore中的动态类型

当类型不能undefined时,如何使编译器抛出错误?

为什么在将条件返回类型的字符串赋给数字时没有类型错误?

angular 17独立使用多个组件(例如两个组件)

TS不推断类型在条件判断后具有属性'

TypeScript类型不匹配:在返回类型中处理已经声明的Promise Wrapper

我应该使用什么类型的React表单onsubmit事件?

如何在排版中正确键入中间件链和控制器链

从子类构造函数推断父类泛型类型

Cypress页面对象模型模式.扩展Elements属性

如何将别名添加到vitest配置文件?

通过泛型函数本身推断受约束的泛型参数的类型脚本问题

正交摄影机正在将渲染的场景切成两半

如何通过属性名在两个泛型数组中找到匹配的对象?

在抽象类构造函数中获取子类型

Cypress-验证别名的存在或将别名中的文本与';if';语句中的字符串进行比较

顶点堆叠的图表条形图未在正确的x轴上显示

垫子工具栏不起作用的Angular 布线

如何在TypeScript中描述和实现包含特定属性的函数?

如何根据Typescript 中带有泛型的对象嵌套键数组获取数组或对象的正确类型?