从示例代码开始:
// anniversarycredits.dto.ts
export class AnniversaryCreditsDto {
@IsNumber()
@ApiProperty({
description: 'The amount of credits to award on anniversary.',
})
'creditAmount': number;
@IsString()
@IsOptional()
@ApiProperty({ description: 'The name (appearance only) of this benefit.' })
'name': string;
@IsString()
@IsOptional()
@ApiProperty({
description: 'The description of this benefit (appearance only).',
})
'description': string;
@Equals('ANNIVERSARY_CREDITS')
@IsOptional()
@ApiProperty({
description: 'This is an internal identifier, leave default.',
})
'type' = 'ANNIVERSARY_CREDITS';
}
// benefits.controller.ts (snippet)
@Patch()
update(
@Req() req: any,
@Body()
updateBenefitData: any,
): Promise<ResponseDto> {
switch (updateBenefitData.type) {
case 'ANNIVERSARY_CREDITS':
return this.benefitsService.update(
req._merchantId,
updateBenefitData as AnniversaryCreditsDto,
);
如您所见,我在要投射到的 dto 上设置了类验证器标签。类验证器适用于除我正在转换的情况之外的所有其他情况。在转换时,它不会抛出任何错误并允许任何输入。
我尝试四处寻找答案,似乎找不到遇到同样问题的人。我研究了构造所有对象而不是强制转换的可能性,但使用
new
构造时,验证器似乎并未运行。欢迎任何意见,谢谢。
class-validator,顾名思义,适用于类实例。 Nest 通过巧妙地使用参数元数据反射及其使用 class-transformer
获取传入对象并将其转换为类实例的 ValidationPipe,使其“看似”适用于常规对象。
然后实例有
validate
(来自类验证器)调用,并且实例读取其属性元数据,以便可以正确验证每个属性。 正如您在这里所做的那样,转换只是告诉编译器“看,我知道这个变量就是这个值,相信我”。它没有运行时意义,此时您拥有的只是一个对象。同样,当您使用
any
类型作为
@Body()
参数时,ValidaitonPipe
会查看元数据并“不知道这是什么”并直接返回值,因为没有实例可以故意将其转换为 for验证。如果您需要继续使用这种 any
方法,1)考虑使用
unknown
代替,2)将对象转换为 AnniversaryCreditsDto
的实例,然后 然后使用
validate
从 class-validator
到根据你的装饰看看物品是否有错误。