Node.jsのclass-validatorでユニークバリデーション

2019-09-23

nodejsのclass-validatorについて。

https://github.com/typestack/class-validator

インストール

npm install class-validator --save

modelクラスのプロパティにアノテーションでバリデーションルールを記載し、1つのメソッドでバリデーションチェックしてくれるライブラリだ。

ほとんど使い方は公式にある通りでする理解できるが、ユニークチェックに少しハマったのでメモ。

class-validatorでユニークバリデーションチェック

Hogeクラスはhogeテーブルのモデルで、emailカラムの重複チェックをしたい時は以下のようにする。

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

export class Hoge {

	@Unique({
        message: "このメールアドレスは既に使用されています。"
    })
    public email: string | null = null;
}

@ValidatorConstraint({async: true})
export class UniqueConstraint implements ValidatorConstraintInterface {
    async validate(value: any, args: ValidationArguments) {
    	// DBに接続してvalueの一致レコードを取得
    	// 一致レコードが存在する場合はfalse(バリデーションエラー)
        return true
    }
}

export function Unique(validationOptions?: ValidationOptions) {
    return function (object: Object, propertyName: string) {
        registerDecorator({
            target: object.constructor,
            propertyName: propertyName,
            options: validationOptions,
            constraints: [],
            validator: UniqueConstraint
        });
    };
}

後は普通にvalidateメソッド呼び出しでバリデーションできる。

const hoge = new Hoge()
hoge.email = 'test@test.com' //既に登録されているemail
validate(hoge).then(errors => {
    // このメールアドレスは既に使用されています。
});