Pie*_*uso 16 typescript class-validator nestjs
今天,我试图弄清楚如何在应用程序的后端 (NestJS) 中验证注册表单。我只是想知道是否存在一种验证password
和passwordConfirm
匹配的方法,使用class-validator
包来构建自定义验证器或利用提供的验证器。我在考虑类验证器,而不是字段验证器。
// Maybe validator here
export class SignUpDto {
@IsString()
@MinLength(4)
@MaxLength(20)
username: string;
@IsString()
@MinLength(4)
@MaxLength(20)
@Matches(/((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/, {message: 'password too weak'})
password: string;
@IsString()
@MinLength(4)
@MaxLength(20)
passwordConfirm: string;
}
Run Code Online (Sandbox Code Playgroud)
你有什么建议?
Pie*_*uso 30
最后,由于@ChristopheGeers在我的问题评论中的建议,我设法解决了密码匹配问题:
@piero:如前所述,尚不支持。但这里有一个示例装饰器 (@IsLongerThan):LINK .... 它检查一个属性是否比另一个属性长。因此,可以将一种属性与另一种属性进行比较。您可以使用此示例创建一个可以执行您想要的操作的装饰器。
这是我提出的解决方案:
export class SignUpDto {
@IsString()
@MinLength(4)
@MaxLength(20)
username: string;
@IsString()
@MinLength(4)
@MaxLength(20)
@Matches(/((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/, {message: 'password too weak'})
password: string;
@IsString()
@MinLength(4)
@MaxLength(20)
@Match('password')
passwordConfirm: string;
}
Run Code Online (Sandbox Code Playgroud)
import {registerDecorator, ValidationArguments, ValidationOptions, ValidatorConstraint, ValidatorConstraintInterface} from 'class-validator';
export function Match(property: string, validationOptions?: ValidationOptions) {
return (object: any, propertyName: string) => {
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
constraints: [property],
validator: MatchConstraint,
});
};
}
@ValidatorConstraint({name: 'Match'})
export class MatchConstraint implements ValidatorConstraintInterface {
validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
const relatedValue = (args.object as any)[relatedPropertyName];
return value === relatedValue;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个扩展示例,它内联验证器并为其提供默认消息。这样您就不必在每次使用@IsEqualTo
装饰器时都输入消息。
import {
registerDecorator,
ValidationArguments,
ValidationOptions
} from 'class-validator';
export function IsEqualTo(property: string, validationOptions?: ValidationOptions) {
return (object: any, propertyName: string) => {
registerDecorator({
name: 'isEqualTo',
target: object.constructor,
propertyName,
constraints: [property],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
const relatedValue = (args.object as any)[relatedPropertyName];
return value === relatedValue;
},
defaultMessage(args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
return `${propertyName} must match ${relatedPropertyName} exactly`;
},
},
});
};
}
Run Code Online (Sandbox Code Playgroud)
接受的答案对我来说非常好,但我们可能会犯拼写错误,例如:
@Match('passwordd')
//
Run Code Online (Sandbox Code Playgroud)
所以我想更加严格Generics
@Match(SignUpDto, (s) => s.password)
Run Code Online (Sandbox Code Playgroud)
匹配装饰器.ts
import { ClassConstructor } from "class-transformer";
export const Match = <T>(
type: ClassConstructor<T>,
property: (o: T) => any,
validationOptions?: ValidationOptions,
) => {
return (object: any, propertyName: string) => {
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
constraints: [property],
validator: MatchConstraint,
});
};
};
@ValidatorConstraint({ name: "Match" })
export class MatchConstraint implements ValidatorConstraintInterface {
validate(value: any, args: ValidationArguments) {
const [fn] = args.constraints;
return fn(args.object) === value;
}
defaultMessage(args: ValidationArguments) {
const [constraintProperty]: (() => any)[] = args.constraints;
return `${constraintProperty} and ${args.property} does not match`;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我们可以Match
这样使用装饰器:
export class SignUpDto {
// ...
password: string;
// finally, we have
@Match(SignUpDto, (s) => s.password)
passwordConfirm: string;
}
Run Code Online (Sandbox Code Playgroud)
对于验证密码,我建议使用@IsStrongPassword
fromclass-validator
可能是这样的
@IsStrongPassword({
minLength: 8,
minLowercase: 1,
minNumbers: 1,
minSymbols: 1,
minUppercase: 1
})
@IsStrongPassword
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13504 次 |
最近记录: |