验证具有至少一个不可为空字段的对象

问题描述 投票:0回答:1

问题:
后端将接收一个对象,并且至少一个字段必须是不可为空的。

dto 对象示例:

export class MessageDto implements TMessage {
    @IsString()
    @MinLength(1)
    roomId: TValueOf<Pick<Room, "id">>;

    @IsArray()
    @MinLength(1, {
        each: true,
    })
    attachmentIds: TValueOf<Pick<File, "id">>[];

    @IsString()
    text: TValueOf<Pick<Message, "text">>;

    @IsOptional()
    @IsString()
    replyToMessageId: TValueOf<Pick<Message, "id">> | null;
}

解释 - 上述对象可能既不包含attachmentIds也不包含文本。我想确定是

attachmentIds.length > 0
text.length > 0

问题:
有没有一种方法不仅可以验证一个字段,还可以使用 NestJs 框架中默认包含的“class-validator”包来验证整个对象(或成对的字段)? 我不敢相信,“class-validator”包是该项目的瓶颈,我将不得不用另一个包替换它,例如“yup”或“zod”。

解决方法:
我只是在 NestJs.Controller 中重新验证该对象。但我想让代码更清晰。

express validation nestjs class-validator
1个回答
0
投票

我将提出与我在项目中实施的相同解决方案。 逻辑是:

  • A) 添加一个额外的字段/属性来声明您期望的输入类型。
  • B)因此,您之前使用所有可能的输入值定义了一个枚举。在本例中 1) 附件和 2) 文本 然后,对于依赖于此的所有其他属性,您使用装饰器 @ValidateIf(),并且在每种情况下,根据 'inputType' 属性,验证器分别工作(如果它们传递 @ValidateIf(condition) ).

需要指出的是,‘inputType’不能为空,必须为必填。因此,您的目标将会实现,至少有一个可能的输入为 NOT 空。

enum InputType {
    ATTACHMENT = 'attachment',
    TEXT = 'text',
}

export class MessageDto implements TMessage {
    @IsString()
    @MinLength(1)
    roomId: TValueOf<Pick<Room, "id">>;

    @IsEnum(InputType)
    inputType!: InputType;

    @ValidateIf((o) => o.inputType === InputType.ATTACHMENT)
    @IsArray()
    @MinLength(1, {
        each: true,
    })
    @IsNotEmpty()
    attachmentIds: TValueOf<Pick<File, "id">>[];

    @ValidateIf((o) => o.inputType === InputType.TEXT)
    @IsString()
    @MinLength(1)
    text: TValueOf<Pick<Message, "text">>;

    @IsOptional()
    @IsString()
    replyToMessageId: TValueOf<Pick<Message, "id">> | null;
}
© www.soinside.com 2019 - 2024. All rights reserved.