2

我有带有服务器和客户端的 NestJs 的应用程序,在服务器端我ValidationPipe在 DTO 类上使用和使用装饰器,例如

export class SearchDto {
   @IsOptional()
   readonly offset?: string;

   @IsString()
   readonly value: string;

   @IsNumber()
   readonly limit: number;
}

一切正常,但是在客户端我不能使用带有装饰器的类(它的严格规则),我只需要像这样使用它type,-const search: SearchDto = await...

class-validator( class-transformer) 在没有结束的情况下如何工作ValidationPipe?它是像在服务器端一样包装还是完全忽略?它会调用__decorate并将其放入 js 包中吗?

否则我需要编写这样的接口

export class SearchDto implements ISearchDto {
   @IsOptional()
   readonly offset?: string;

   @IsString()
   readonly value: string;

   @IsNumber()
   readonly limit: number;
}

export interface ISearchDto {
  offset?: string;
  value: string;
  limit: number;
}

let decorated: SearchDto;
let nonDecorated: ISearchDto;

感谢帮助

4

1 回答 1

2

如果您不允许使用带有装饰器的类,您可能需要考虑使用带有模式的类验证器,这样就不需要装饰器了。

类验证器通过它使用的装饰器设置有关字段的元数据来工作,并且只能在类型上做很多事情。然后,该库读取该元数据并根据对象/字段的当前类型对其进行检查,并确定其条件是否满足。该库是自包含的,因此不需要访问服务器或任何东西。如果您查看 的源代码ValidationPipe,您可以看到 Nest 只是在转换对象class-transformer(也称为反序列化)以使 JSON 对象成为 JavaScript 类,然后通过 运行该类class-validator,检查结果并返回,或者对象的实例(如果transform: true在选项中设置),或验证后的原始有效负载。

这些装饰器定义的元数据可以通过上面第一个链接中描述的模式文件来模仿。

于 2020-03-03T16:23:50.000 回答