今日、私はアプリのバックエンド側(NestJS)でサインアップフォームを検証する方法を理解しようとしています。 class-validator
パッケージを使用してpassword
とpasswordConfirm
の一致を検証する方法が存在するかどうか疑問に思っています。私はフィールドバリデーターではなくクラスバリデーターについて考えています。
// 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;
}
何を指示してるんですか?
バリデータをインライン化し、デフォルトのメッセージを提供する拡張例を次に示します。これにより、@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 `$property must match ${relatedPropertyName} exactly`;
},
},
});
};
}