前言

默认情况下class-validator这个库本身并没有提供二次密码校验的方式,所以我们需要自己去实现这个功能,那么自然是需要实现一个符合库规范的属性装饰器了。

首先我们需要知道,在class-validator中,自己实现一个校验方式,是可以获取到校验对象的,既然可以获取到校验的对象,自然可以读取对象里的那些属性了,为此实现一个二次密码校验是非常简单的。

教程

假设我们的数据对象如下:

{
  name: "",
  password: "",
  confirmPassword: ""
}

我们需要判断confirmPasswordpassword是否一致。

根据方法文档示例,我们如下操作:

官方文档:class-validator

创建文件:IsSameValue.ts

import { registerDecorator, ValidationOptions, ValidationArguments } from "class-validator";

export function IsSameValue(property: string, validationOptions?: ValidationOptions) {
    return function (object: any, propertyName: string) {
        registerDecorator({
            name: "IsSameValue",
            target: object.constructor,
            propertyName: propertyName,
            constraints: [property],
            options: validationOptions,
            validator: {
                validate(value: any, args: ValidationArguments) {
                    const [confirmKey] = args.constraints;
                    const confirmValue = (args.object as any)[confirmKey];
                    return confirmValue === value;
                }
            }
        });
    };
}

官方的示例,如果我们需要取装饰器的参数,它其实是把它传到了registerDecorator方法参数constraints中,如果你只有一个参数,其实像官方那么取也行,通过解构的方式。

const [confirmKey] = args.constraints;

但是官方对于参数的定义很单薄,直接就是any了,我更推荐直接通过函数闭包的效果,直接用property形参。

validate函数中,接收了两个参数:

  1. value 当前校验的值
  2. args 其他参数,里面就包含了很多数据,下面是一个打印:
{
  targetName: 'RegisterDto',
  property: 'confirmPassword',
  object: RegisterDto {
    email: 'f.qurwwics@mevkqft.mp',
    password: '123456',
    confirmPassword: '123456'
  },
  value: '123456',
  constraints: [ 'password' ]
}

object就是被校验的对象,property是当前装饰器作用的属性名。

使用

import { IsEmail, Length, IsNotEmpty } from "class-validator";
import { IsSameValue } from "../utils/class-validator-extends/IsSameValue";

/** 注册dto */
export class RegisterDto {
    /** 邮箱 */
    @IsNotEmpty({ message: "邮箱不能为空" })
    @IsEmail({}, { message: "邮箱格式不正确" })
    email: string;
    /** 密码 */
    @IsNotEmpty({ message: "密码不能为空" })
    @Length(6, 20, { message: "密码长度为6-20位" })
    password: string;
    /** 确认密码 */
    @IsNotEmpty({ message: "确认密码不能为空" })
    @IsSameValue("password", { message: "两次密码不一致" })
    confirmPassword: string;
}
@IsSameValue("password", { message: "两次密码不一致" })

在调用时通过参数形式告诉校验器需要和哪个字段进行比对。

分类: Nest.js 标签: 密码Nestjsclass-validator二次校验自定义验证

评论

暂无评论数据

暂无评论数据

目录