Nestjs使用class-validator实现二次密码校验
前言
默认情况下class-validator这个库本身并没有提供二次密码校验的方式,所以我们需要自己去实现这个功能,那么自然是需要实现一个符合库规范的属性装饰器了。
首先我们需要知道,在class-validator中,自己实现一个校验方式,是可以获取到校验对象的,既然可以获取到校验的对象,自然可以读取对象里的那些属性了,为此实现一个二次密码校验是非常简单的。
教程
假设我们的数据对象如下:
{
name: "",
password: "",
confirmPassword: ""
}
我们需要判断confirmPassword
和password
是否一致。
根据方法文档示例,我们如下操作:
官方文档: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
函数中,接收了两个参数:
value
当前校验的值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: "两次密码不一致" })
在调用时通过参数形式告诉校验器需要和哪个字段进行比对。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据