问题:
后端将接收一个对象,并且至少一个字段必须是不可为空的。
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 中重新验证该对象。但我想让代码更清晰。
我将提出与我在项目中实施的相同解决方案。 逻辑是:
需要指出的是,‘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;
}