是否存在可拒绝含表情符号字符串的class-validator装饰器?
用class-validator验证DTO字段是否包含表情符号
因为class-validator没有内置的表情符号验证规则,我们可以通过自定义验证器来实现这个需求,具体步骤如下:
1. 实现自定义验证器
创建一个自定义的验证装饰器@IsNotContainEmoji,用来检查字符串中是否包含表情符号:
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator'; // 匹配大部分常见表情符号的正则表达式 const EMOJI_REGEX = /[\p{Emoji}]/u; export function IsNotContainEmoji(validationOptions?: ValidationOptions) { return function (object: Object, propertyName: string) { registerDecorator({ name: 'isNotContainEmoji', target: object.constructor, propertyName: propertyName, constraints: [], options: validationOptions, validator: { validate(value: any, args: ValidationArguments) { // 仅对字符串类型进行验证 if (typeof value !== 'string') return true; // 检查是否匹配表情符号正则 return !EMOJI_REGEX.test(value); }, defaultMessage(args: ValidationArguments) { return `${args.property}字段不能包含表情符号`; }, }, }); }; }
2. 在DTO中使用自定义验证器
将@IsNotContainEmoji装饰器添加到需要验证的字段上(比如corporateName和comercialName):
import { IsNotEmpty, IsEmail, IsString, MaxLength } from 'class-validator'; import { IsNotContainEmoji } from './path-to-your-validator'; // 替换为你的验证器文件路径 export class CreateShopkeeperDto { @IsNotEmpty() @IsEmail() email: string; @IsNotEmpty() @IsString() @MaxLength(64) @IsNotContainEmoji() corporateName: string; @IsNotEmpty() @IsString() @MaxLength(64) @IsNotContainEmoji() comercialName: string; }
说明
- 正则表达式
/[\p{Emoji}]/u使用Unicode属性转义,能匹配大部分标准表情符号,包括彩色表情、表情组件等 - 自定义验证器中先判断值是否为字符串,避免非字符串类型的验证错误
- 你可以通过
validationOptions自定义错误提示信息,比如@IsNotContainEmoji({ message: '企业名称不能包含表情' })
内容的提问来源于stack exchange,提问作者Erick Scur
相关产品推荐
相关产品推荐

