类验证器不区分大小写的枚举验证?

Hra*_*yan 4 enums case-sensitive node.js class-validator

我有这样的 anum:

export enum UserRole {
  USER,
  ADMIN,
  BLOGGER
}
Run Code Online (Sandbox Code Playgroud)

并像这样 create.user.dto

import { IsEmail, IsEnum, IsNotEmpty, IsOptional } from 'class-validator';
import { UserRole } from './user.entity';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsNotEmpty()
  firstName: string;

  @IsNotEmpty()
  lastName: string;

  @IsOptional()
  username: string;

  @IsOptional()
  @IsEnum(UserRole)
  role: UserRole;

  @IsNotEmpty()
  password: string;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我只发布角色大写 ('ADMIN','USER') 或 'BLOGGER',角色验证不会失败。

如何使类验证器不区分大小写?我的意思是,也验证“admin”“aDmIn”为真。

Ala*_*a96 8

对于它的价值,您还可以使用class-validator@Transform装饰器来匹配您的枚举大小写。

export enum UserRole {
 USER = "user",
 ADMIN = "admin",
 BLOGGER = "blogger"
}
Run Code Online (Sandbox Code Playgroud)

然后在你的 DTO 中:

@IsOptional()
@Transform(({ value }) => ("" + value).toLowerCase())
@IsEnum(UserRole)
role: UserRole;
Run Code Online (Sandbox Code Playgroud)

为我工作过"class-validator": "^0.14.0"


sat*_*ime 5

那么你需要通过@Matches.

  @IsOptional()
  @Matches(`^${Object.values(UserRole).filter(v => typeof v !== "number").join('|')}$`, 'i')
  role: UserRole;
Run Code Online (Sandbox Code Playgroud)

最终规则是/^USER|ADMIN|BLOGGER$/i, wherei忽略大小写。