You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在可拒绝含表情符号字符串的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:57:14