🙌
TypeScriptのAjv JSON schema validatorで複数バリデーション対応
TypeScript(Node.js)のバリデーションライブラリ「Ajv」で一個のフィールドしかバリデーションのエラーが返ってこず、ハマったので共有です
APIのリクエストでnameパラメータとname_kanaパラメータがあったとします。
この二つのパラメータが必須でバリデーションをかけます。
バリデーションエラーではnameとname_kana両方を返して欲しいのですが、デフォルトの設定だと一つしか返ってこなかったです。
現状
{
instancePath: '',
schemaPath: '#/required',
keyword: 'required',
params: { missingProperty: 'name' },
message: "must have required property 'name'"
},
期待値
{
instancePath: '',
schemaPath: '#/required',
keyword: 'required',
params: { missingProperty: 'name' },
message: "must have required property 'name'"
},
{
instancePath: '',
schemaPath: '#/required',
keyword: 'required',
params: { missingProperty: 'name_kana' },
message: "must have required property 'name_kana'"
}
対応方法です。
デフォルトでは複数のエラーを返してこないので、追加のライブラリをインストールし、ajvをインスタンス化する時に複数エラーを返すようにします。
ライブラリをインストール
npm install ajv-errors
コードサンプル
スキーマ
export default {
type: "object",
properties: {
name: { type: 'string' },
name_kana: { type: 'string' }
},
required: ['name', 'name_kana']
} as const;
実際の処理
//これが重要。allErrors: trueで設定すると複数のバリデーションエラーを返してくれる
const ajv = new Ajv({allErrors: true})
// バリデーションを実行
const valid = ajv.validate(schema,event.body);
if (!valid) {
//ajv.errorsにnameとname_kanaのバリデーションが返ってくる。
console.log(ajv.errors);
}
Discussion