🙌

TypeScriptのAjv JSON schema validatorで複数バリデーション対応

2023/03/03に公開

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