乐闻世界logo
搜索文章和话题

如何在类验证器NestJS中删除自定义消息中的字段名

3 个月前提问
3 个月前修改
浏览次数13

1个答案

1

在NestJS中,使用类验证器(class-validator)进行数据验证时,默认情况下,错误消息会包含具体的字段名。例如,如果有一个字段名为username的验证规则未通过,它可能返回一个错误消息如:“username must be longer than or equal to 10 characters”。

如果希望在自定义的验证消息中去掉字段名,可以通过自定义错误消息并在其中不包含字段名来实现。这可以通过在装饰器中使用字符串模板来完成。例如,考虑以下使用class-validator的用户类:

typescript
import { IsLength, IsEmail } from 'class-validator'; export class CreateUserDto { @IsLength(10, 20, { message: '长度必须在10到20字符之间' }) username: string; @IsEmail({}, { message: '提供的值必须是有效的电子邮件地址' }) email: string; }

在上面的例子中,我们自定义了错误消息,并去掉了字段名。这样,当username长度不符或email格式不正确时,返回的错误消息将仅显示“长度必须在10到20字符之间”和“提供的值必须是有效的电子邮件地址”,而不会显示字段名。

此外,如果需要进一步定制或动态生成错误消息(例如,根据不同的语言环境),可以考虑使用自定义验证装饰器或使用class-validator的回调函数功能来生成错误消息。这样可以实现更复杂和动态的验证逻辑。

例如,创建一个自定义验证器来检查字符串是否包含特定的字符,而不在消息中包含字段名:

typescript
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator'; function ContainsLetter(letter: string, validationOptions?: ValidationOptions) { return function (object: any, propertyName: string) { registerDecorator({ name: 'containsLetter', target: object.constructor, propertyName: propertyName, constraints: [letter], options: validationOptions, validator: { validate(value: any, args: ValidationArguments) { const [relatedLetter] = args.constraints; return typeof value === 'string' && value.includes(relatedLetter); }, defaultMessage(args: ValidationArguments) { return `必须包含字母${args.constraints[0]}`; } } }); }; } // 使用 class SomeClass { @ContainsLetter('x', { message: '必须包含字母x' }) myField: string; }

这样,当myField不包含字母'x'时,错误消息将仅显示“必须包含字母x”,而不会提到myField。这种方法提供了更高的灵活性和控制能力,在实际应用中可以根据需求自由定制。

2024年8月24日 17:33 回复

你的答案