Typescript 如何使用NestJS中的同一类更改嵌套对象中的验证
我有一个前端应用程序,它向我的后端应用程序发送一个带有以下JSON主体的POST请求Typescript 如何使用NestJS中的同一类更改嵌套对象中的验证,typescript,nestjs,class-validator,Typescript,Nestjs,Class Validator,我有一个前端应用程序,它向我的后端应用程序发送一个带有以下JSON主体的POST请求 { "principal": { "name": "John Doe", "birth": "1990-01-01T02:00:00.000Z", "phone": "(12) 341 234 124",
{
"principal": {
"name": "John Doe",
"birth": "1990-01-01T02:00:00.000Z",
"phone": "(12) 341 234 124",
"email": "test@test.com"
},
"companion": {
"name": "",
"birth": null,
"phone": "",
"email": ""
},
... // some other data
}
在我的后端应用程序中,我正在使用NestJS,因为,principal
和companion
具有相同的属性,所以我映射到以下DTO
import { IsNotEmpty, IsString } from "class-validator";
export class NewDataDto {
principal: PersonDto;
companion: PersonDto;
// some other data
}
export class PersonDto {
@IsNotEmpty()
@IsString()
name: string;
birth?: Date;
@IsNotEmpty()
@IsString()
phone: string;
@IsNotEmpty()
@IsString()
email: string;
}
因此,在
principal
对象中,所有属性都是必需的,但在companion
对象中,所有属性都是可选的。由于两个对象中的所有属性都相同,只有验证发生了变化,因此如何使用相同的类对两个对象进行验证?因此我找到了问题的答案。确实有办法做到这一点。不使用同一个类,但不损害干式主体和重用代码。我会把它贴在这里,这样就可以让有同样问题的人受益
export class PersonDto {
protected validateRequiredFields = false;
@ValidateIf((o) => o.validateRequiredFields || o.name)
@IsNotEmpty()
@IsString()
name: string;
birth?: Date;
@ValidateIf((o) => o.validateRequiredFields || o.phone)
@IsNotEmpty()
@IsString()
phone: string;
@ValidateIf((o) => o.validateRequiredFields || o.email)
@IsNotEmpty()
@IsString()
email: string;
}
export class PrincipalDto extends PersonDto{
constructor() {
super();
this.validateRequiredFields = true;
}
}
export class NewDataDto {
@ValidateNested()
@Type(() => PrincipalDto)
@IsDefined()
principal: PrincipalDto;
@ValidateNested()
@Type(() => PersonDto)
companion: PersonDto;
// some other data
}
这里有一些事情需要注意
首先,如果所有类都在同一个文件中,则需要首先声明没有依赖关系的类
其次,在@ValidateIf
中,您需要将validaterequired字段
与OR子句和要验证的字段放在一起,因为您希望验证字段是否具有某些值
第三,在我的例子中,验证母类时,请确保正确验证了@Type
。并将@IsDefined
放入要验证所需字段的属性中
最后,您可以在构造函数内部或外部重写
validateRequiredFields
,并且在子类中没有构造函数,这样就可以正常工作。但我个人喜欢构造器思想中的覆盖。你试过了吗?是的,我试过了。但是我有两个具有不同验证的对象,它们是同一个类,因此,例如,名称
,必须在主体
中要求,但在同伴
中可以为空。为验证目的创建单独的类怎么样?是的,我同意Bruno的观点,最好将类分开。还可以看看nest js中的映射类型包是的,这是一种解决方法。但严重违反了这一原则,使我不愿意遵循这一解决方案。