TypeORM中如何使用class-validator类验证器处理空白字符串
解决方案
问题原因
class-validator 内置的 @IsNotEmpty() 仅会校验值是否为 null、undefined 或空字符串'',全空格组成的字符串' '会被判定为合法值,所以不会触发校验拦截。
修复方法
你只需要修改DTO层的字段校验规则即可,推荐三种常用方案,按需选择即可:
方案1:用内置@IsNotBlank装饰器(推荐)
如果你使用的class-validator版本在0.14.0及以上,可以直接用内置的@IsNotBlank()装饰器,专门用来拦截空值和全空格字符串:
import { IsNotBlank, IsString } from 'class-validator'; export class CreateRoomUserDto { @IsNotBlank({ message: '用户名不能为空或全空格' }) @IsString() public name: string; @IsNotBlank({ message: '兴趣领域不能为空或全空格' }) @IsString() public room_interest: string; @IsNotBlank({ message: '职业不能为空或全空格' }) @IsString() public occupation: string; }
方案2:增加非空白字符正则校验
如果你的class-validator版本较低不支持@IsNotBlank(),可以用@Matches()正则校验,要求字段必须包含至少一个非空白字符:
import { IsNotEmpty, IsString, Matches } from 'class-validator'; export class CreateRoomUserDto { @IsNotEmpty() @IsString() @Matches(/\S/, { message: '用户名不能为全空格' }) public name: string; @IsNotEmpty() @IsString() @Matches(/\S/, { message: '兴趣领域不能为全空格' }) public room_interest: string; @IsNotEmpty() @IsString() @Matches(/\S/, { message: '职业不能为全空格' }) public occupation: string; }
方案3:先去除首尾空格再校验
如果你需要自动去掉用户输入的前后冗余空格,可以搭配class-transformer的@Trim()装饰器,先把字段前后空格去掉,再用@IsNotEmpty()校验,全空格内容trim后会变成空字符串,直接被拦截:
import { IsNotEmpty, IsString } from 'class-validator'; import { Trim } from 'class-transformer'; export class CreateRoomUserDto { @Trim() @IsNotEmpty({ message: '用户名不能为空或全空格' }) @IsString() public name: string; @Trim() @IsNotEmpty({ message: '兴趣领域不能为空或全空格' }) @IsString() public room_interest: string; @Trim() @IsNotEmpty({ message: '职业不能为空或全空格' }) @IsString() public occupation: string; }
注意:使用该方案需要确保你的全局管道开启了transform: true配置,否则@Trim()不会生效
额外修正点
你贴的实体类代码存在两个可优化的问题:
- 实体类上的
Entity()装饰器漏了@符号,正确写法是@Entity() - 实体类里不需要加
@IsNotEmpty()校验,TypeORM默认不会触发实体类的class-validator规则,校验逻辑统一放在DTO层即可
内容的提问来源于stack exchange,提问作者William Pepple
相关产品推荐
相关产品推荐

