ajvを使ってJSONのバリデーションをするときに $ref を使用する場合

ajv を使用すると JSON Schema を基に JSON のバリデーションを行うことができます。

https://github.com/epoberezkin/ajv

JSON Schema で ref を使っている場合は、addSchema でスキーマを繋ぐ必要があります。

例えば、以下のようなスキーマを定義したとします。

const usersSchema = {
  $id: "http://example.com/schemas/users.json",
  type: 'array',
  items: {
    $ref: "defs.json#/definitions/User"
  }
}

const defsSchema = {
  $id: "http://example.com/schemas/defs.json",
  definitions: {
    User: {
      required: ["id", "name", "age", "desc"],
      type: "object",
      properties: {
        id: {
          "type": "integer"
        },
        name: {
          "type": "string"
        },
        age: {
          "type": "number"
        },
        desc: {
          "type": "string",
          "maxLength": 15
        }
      }
    }
  },
}

usersSchema が今回使用するスキーマです。

defsSchema は definitions で User を定義しており、usersSchema から $ref で利用されています。

ajv では $id を使って参照を行うようなので、上記のように $id を指定する必要があるようです。

https://github.com/epoberezkin/ajv/blob/master/docs/validation.md#combining-schemas-with-ref

今回の場合は以下のようになります。

const ajv = new Ajv.default()
const validate = ajv.addSchema(defsSchema).compile(usersSchema)