我正在尝试找到一种使用DTO(使用出色的class-validator
和class-transformer
库)验证实体的好方法。即使是嵌套结构,它也确实能很好地工作,但就我而言,我希望基于某些条件具有body属性。
可能会帮助您理解的示例:
让我们想象我的身体应该总是selectedCategory
。
根据该字段,内容可以来自包含prop1
的类别1,也可以来自包含prop2
的类别2。
我不想为他们两个都使用null,我真的想必须定义prop1
或基于prop2
的{{1}}。
我认为我可以使用管道,但是如何指定正确的DTO使用?
我已经建立了一个具有所有常用属性的“基”类,以及从其继承的其他几个类。
我可以基于属性selectedCategory
手动实例化管道,这是理想的选择,但我不知道要作为管道的第二个参数(元数据)传递什么。
感谢您的帮助。
答案 0 :(得分:2)
您是否尝试过使用groups? 您不必创建多个DTO,而只需创建一个DTO。每个属性都分配给一个或多个组:
@Min(12, {groups: ['registration', 'update']})
age: number;
@Length(2, 20, {groups: ['registration']})
name: string;
然后您可以有条件地将组传递给类转换器/验证器:
@Injectable()
export class ConditionalValidationPipe implements PipeTransform {
async transform(entity: any, metadata: ArgumentMetadata) {
// Dynamically determine the groups
const groups = [];
if (entity.selectedCategory === 1) {
groups.push('registration');
}
// Transform to class with groups
const entityClass = plainToClass(EntityDto, entity, { groups })
// Validate with groups
const errors = await validate(entityClass, { groups });
if (errors.length > 0) {
throw this.createError(errors);
}
return entityClass;
}
}
答案 1 :(得分:0)
您是否尝试过 ValidateIf 语句?
您可以对 props1
或 props2
进行多次验证,并在 selectedCategory
相应地为“类别 1”或“类别 2”时应用它们。