web-dev-qa-db-ja.com

`class-validator`によるTypeScriptでのパスワード確認

今日、私はアプリのバックエンド側(NestJS)でサインアップフォームを検証する方法を理解しようとしています。 class-validatorパッケージを使用してpasswordpasswordConfirmの一致を検証する方法が存在するかどうか疑問に思っています。私はフィールドバリデーターではなくクラスバリデーターについて考えています。

// 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;
}

何を指示してるんですか?

2
Piero Macaluso

バリデータをインライン化し、デフォルトのメッセージを提供する拡張例を次に示します。これにより、@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`;
        },
      },
    });
  };
}
1