npmのclass-validatorでカスタムバリデータを作ったので備忘録として残しておきます。ここではclass-validatorの詳細については触れませんので公式を参照してください。
class-validatorの使用例
下記のようにクラスのメンバーに対してデコレータを記述するだけでバリデーションが適用されます。記述されたデコレータのルールはすべてが判定の対象です。
import {
IsEmail,
IsNotEmpty,
IsString,
MinLength,
} from 'class-validator'
export class AuthDto {
@IsEmail() // メールアドレスの形式になっているか
@IsNotEmpty() // 値が入っているか(!== '', !== null, !== undefined)
email: string
@IsString() // 文字列か
@IsNotEmpty() // 値が入っているか(!== '', !== null, !== undefined)
@MinLength(8) // 8文字以上になっているか
password: string
}
カスタムバリデータの作成
漢字やカタカナ、携帯番号が0で始まるかなど最初からライブラリに用意がないものについてはカスタムバリデータを作成できます。下記は全角スペースを許可しないバリデータと半角スペースを許可しないバリデータです。
import { ValidateBy, ValidationOptions } from "class-validator"
export const isNotIncludeSpace = (validationOptions?: ValidationOptions): PropertyDecorator => {
return ValidateBy (
{
// バリデータの名称
name: 'isNotIncludeSpace',
// バリデーションの内容
validator: {
validate(value): boolean {
// 半角スペースを含むか
return !value.includes(' ')
}
}
},
validationOptions,
)
}
export const isNotIncludeZenkakuSpace = (validationOptions?: ValidationOptions): PropertyDecorator => {
return ValidateBy (
{
name: 'isNotIncludeZenkakuSpace',
validator: {
validate(value): boolean {
// 全角スペースを含むか
return !value.includes(' ')
}
}
},
validationOptions,
)
}
カスタムバリデータの利用
import {
IsEmail,
IsNotEmpty,
IsString,
MinLength,
} from 'class-validator'
// 作成したカスタムバリデータをインポート
import {
isNotIncludeSpace,
isNotIncludeZenkakuSpace,
} from 'helpers/customValidator'
export class AuthDto {
@IsEmail()
@IsNotEmpty()
email: string
@IsString()
@IsNotEmpty()
@MinLength(8)
password: string
@IsString()
@IsNotEmpty()
// messageプロパティでエラーの際に表示するメッセージを指定
@isNotIncludeSpace({ message: '半角スペースは含めることができません' }) // 半角スペースのチェック
@isNotIncludeZenkakuSpace({ message: '全角スペースは含めることができません' }) // 全角スペースのチェック
nickname: string
}
まとめ
今回試しに使っただけなので半角スペースを判定するバリデータと全角スペースを判定するバリデータを作成しましたが、実際には半角スペースと全角スペースの判定であれば最初から用意されている
@NotContains
というデコレータで対応できると思います。
下記のようにvalidatorの中身を変更すれば全角カナや半角カナのチェックもできます。
{
name: 'isZenkakuKana',
validator: {
validate(value): boolean {
// 全角カナか
return !!value.match(/^[ァ-ヶー ]*$/)
}
}
},
{
name: 'isHankakuKana',
validator: {
validate(value): boolean {
// 半角カナか
return !!value.match(/^[ヲ-゚]*$/)
}
}
},