相关文章推荐
细心的绿豆  ·  MYSQL  GROUP BY ...·  1 年前    · 
无邪的柑橘  ·  Oops!!! - 简书·  1 年前    · 
成熟的登山鞋  ·  PHP ...·  1 年前    · 
憨厚的感冒药  ·  javascript - Not in ...·  1 年前    · 

在学习nestjs的路途中遇到了一个不大不小的弯道,在DTO中使用class-validator校验联合类型问题!google了一下,没有找到简单合适的解决方案,无奈只能认真翻阅github文档,花了些时间最终解决;望新入坑的小伙伴减少弯道,节约时间,快速追赶超车,特此分享😄!

解决思路(github文档: Custom validation decorators

自定义动态验证装饰器: dynamic.validator.ts

import { registerDecorator, ValidationOptions } from 'class-validator';
// 动态验证器;通过回调函数验证
export function DynamicValidator(
  validator: (value: any) => boolean,
  validationOptions?: ValidationOptions,
  return function (object: object, propertyName: string) {
    registerDecorator({
      name: 'DynamicValidator',
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      validator: {
        validate: validator,

在dto中使用:login.dto.ts

import { IsString, isEmail, isMobilePhone } from 'class-validator';
import { DynamicValidator } from '@/validators/dynamic.validator';
export class LoginDto {
   *用户名:手机号/邮箱
   *@example
  @IsString()
  @DynamicValidator(
    (value) => isMobilePhone(value, 'zh-CN') || isEmail(value),
      message: '手机号/邮箱',
  username: string;
  @IsString()
  password: string;

我这里是使用这种回调验证的方式解决联合类型问题(自己的项目,比较随意,灵活为主)!

但是,按照自定义验证装饰器的思路,可以根据自己的需求定制进行封装,不一定非要使用回调函数;比如:可以通过传入基础类型数组['string', 'number', 'boolean'],验证逻辑内置到自定义装饰器中,专门用来验证基础类型的联合类型,这样的装饰器职能比较单一且内聚;

  • 私信