gpt4 book ai didi

node.js - NestJS - 基于一个属性有条件地验证主体

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:40 25 4
gpt4 key购买 nike

我正在尝试找到一种使用 DTO 验证主体的好方法(使用出色的 class-validatorclass-transformer 库)。它工作得非常好,即使对于嵌套结构也是如此,但就我而言,我希望根据某些条件拥有 body 属性。

可能有助于理解的示例:

假设我的 body 应该始终有 selectedCategory。根据该字段,内容可能来自包含 prop1 的类别 1,也可能来自包含 prop2 的类别 2。

我不想让它们都为 null,我真的想要根据 selectedCategory< 定义 prop1prop2/.

我认为我可以使用管道,但我如何才能指定要使用的正确 DTO?

我已经构建了一个“基”类,其中包含所有公共(public)属性和几个从它继承的其他类。

我可以根据属性 selectedCategory 手动实例化管道,这很理想,但我不知道要传递什么作为管道的第二个参数(元数据)。

感谢您的帮助。

最佳答案

您是否尝试过使用 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;
}
}

关于node.js - NestJS - 基于一个属性有条件地验证主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54057006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com