0

任务是nest.js在管理应用程序之前验证应用程序中的有效负载。每个有效负载可以包含tag对象 (1 - 11)。每个tag object只能有一个属性和值(属性由请求确定)

应验证标记对象:

  • 属性应该是一个字符串,任何字符都可以接受:,大小在 1-255 之间
  • value 应该是一个大小在 1-255 之间的字符串

任务看起来很简单。但我不知道如何验证Tag对象中动态构造的属性。

DTO 是(使用 配置的验证class-validator):

import {
  ArrayMaxSize,
  ArrayMinSize,
  IsArray,
  IsDefined,
  IsNotEmpty,
  IsObject,
  IsString,
  Matches,
  MinLength,
  ValidateNested
} from 'class-validator';


export class Payload {
...
  @IsArray()
  @ArrayMinSize(1)
  @ArrayMaxSize(11)
  @ValidateType(() => Tag)
  @ValidateNested()
  @ApiProperty()
  tags: Tag[];
}

为了Tag灵活(因为未知的属性名称),它像Map扩展一样

export class Tag extends Map<string, string>{
}

或单场对象

export class Tag {
  [key: string]: string;
}

如何管理每个所需的验证Tag

(排除输入的正则表达式:is/^[^:]+$/并且应该应用于key

4

1 回答 1

0

我有解决方案,但比解决方案实施更好的是比较可能的方法。

1 场景tags是在字段 上放置额外的自定义验证装饰器

  @IsPropertyNameLength(1, 250,{ each: true })
  @IsPropertyNameMatches(/^[^:]+$/,{ each: true })
  @IsPropertyNameString({ each: true })
  @IsKeyNameLength(1, 250,{ each: true })
  @IsKeyNameMatches(/\w+|\d+/,{ each: true })
  @IsKeyNameString({ each: true })
  tags: Tag[];

这可能是一个很好的解决方案。按照这种方式,我们会意识到装饰器名称并没有带来足够的信息。为了使它们更通用,我们可以添加更多参数。但是这种改进不能改变我们验证不是当前或下一级属性的事实。我们在下一个级别(tags[]-> Tag-> theProperty)之后的下一个进行属性验证。

2 场景 是管理中间件层的验证。如果您想在提供的格式和流程相似的情况下制作报告,可能会带来一些困难,class-validator但好处是我们可以在不同的方法上进行验证,从而构建更复杂的验证树。也很容易进行测试。

3 场景 是拒绝动态属性名称(如果可能的话)并考虑开发替代模型,例如

export class Tag {
  key: string;
  value: string;
}

它让我们有机会使用提供的装饰器来class-validator满足我们的需求,例如

export class Tag {
  @Length(1, 250)
  @Matches(/^[^:]+$/)
  key: string;
  @Length(1, 250)
  @Matches(/\w+|\d+/)
  value: string;
}

附言

我已经按照第三种方式管理了我的解决方案。

于 2021-11-25T10:29:38.140 回答