使用类验证器和 nestjs 验证嵌套对象

新手上路,请多包涵

我正在尝试使用类验证器和 NestJS 来验证嵌套对象。我已经尝试通过使用 class-transform 中的 @Type 装饰器来关注此 线程,但没有任何运气。这就是我所拥有的:

数据传输协议:

 class PositionDto {
  @IsNumber()
  cost: number;

  @IsNumber()
  quantity: number;
}

export class FreeAgentsCreateEventDto {

  @IsNumber()
  eventId: number;

  @IsEnum(FinderGamesSkillLevel)
  skillLevel: FinderGamesSkillLevel;

  @ValidateNested({ each: true })
  @Type(() => PositionDto)
  positions: PositionDto[];

}

我也在使用内置的 nestjs 验证管道,这是我的引导程序:

 async function bootstrap() {
  const app = await NestFactory.create(ServerModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(config.PORT);
}
bootstrap();

它对其他属性工作正常,对象数组是唯一不工作的。

原文由 Leonardo Emilio Dominguez 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 813
2 个回答

您期望 positions: [1] 抛出 400 但它被接受了。

根据这个 Github 问题,这似乎是类验证器中的一个错误。 If you pass in a primitive type ( boolean , string , number ,…) or an array instead of an object,它会接受有效的输入,尽管它不应该。


除了创建 自定义验证装饰器 之外,我没有看到任何标准的解决方法:

 import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

export function IsNonPrimitiveArray(validationOptions?: ValidationOptions) {
  return (object: any, propertyName: string) => {
    registerDecorator({
      name: 'IsNonPrimitiveArray',
      target: object.constructor,
      propertyName,
      constraints: [],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          return Array.isArray(value) && value.reduce((a, b) => a && typeof b === 'object' && !Array.isArray(b), true);
        },
      },
    });
  };
}

然后在你的 dto 类中使用它:

 @ValidateNested({ each: true })
@IsNonPrimitiveArray()
@Type(() => PositionDto)
positions: PositionDto[];

原文由 Kim Kern 发布,翻译遵循 CC BY-SA 4.0 许可协议

对我来说,我可以使用 'class-transformer' 验证嵌套对象

import { Type } from 'class-transformer';

完整示例:

 import {
  MinLength,
  MaxLength,
  IsNotEmpty,
  ValidateNested,
  IsDefined,
  IsNotEmptyObject,
  IsObject,
  IsString,
} from 'class-validator';
import { Type } from 'class-transformer';

class MultiLanguageDTO {
  @IsString()
  @IsNotEmpty()
  @MinLength(4)
  @MaxLength(40)
  en: string;

  @IsString()
  @IsNotEmpty()
  @MinLength(4)
  @MaxLength(40)
  ar: string;
}

export class VideoDTO {
  @IsDefined()
  @IsNotEmptyObject()
  @IsObject()
  @ValidateNested()
  @Type(() => MultiLanguageDTO)
  name!: MultiLanguageDTO;
}

原文由 tarek noaman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题