Использование URI в $ ref с ajv-cli - PullRequest
0 голосов
/ 27 марта 2020

Я хотел бы проверить файл JSON по схеме JSON, которая использует $ref для ссылки на внешнюю схему через URI:

{
  "$schema": "http://json-schema.org/schema#",
  "$id": "https://reconciliation-api.github.io/specs/latest/schemas/manifest.json",
  "type": "object",
  "properties": {
      "authentication": {
         "$ref": "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/schemas/v2.0/schema.json#/definitions/basicAuthenticationSecurity"
      }
   }
}

Я ожидаю, что средство проверки получит связанную схему на лету и используйте ее для проверки моего JSON. Я попытался использовать ajv-cli для этого:

ajv test -s my_schema.json -r "\\\*" -d my_file.json

Я ожидал бы, что -r "\\\*" разрешает ссылку на любую схему, но вместо этого я получаю следующую ошибку:

error: can't resolve reference https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/schemas/v2.0/schema.json#/definitions/basicAuthenticationSecurity
from id https://reconciliation-api.github.io/specs/latest/schemas/manifest.json#

ajv-cli поддерживает выборку удаленных схем на лету? Если нет, есть ли другой валидатор, который поддерживает это?

1 Ответ

1 голос
/ 27 марта 2020

Документация по https://ajv.js.org/#ref предполагает, что вам необходимо включить асинхронное разрешение c: https://ajv.js.org/#asynchronous -schema-compilation

Необходимо определить loadSchema функция в качестве опции в экземпляре ajv, затем вызовите compileAsync.

Пример из документации следующий:

var ajv = new Ajv({ loadSchema: loadSchema });

ajv.compileAsync(schema).then(function (validate) {
  var valid = validate(data);
  // ...
});

function loadSchema(uri) {
  return request.json(uri).then(function (res) {
    if (res.statusCode >= 400)
      throw new Error('Loading error: ' + res.statusCode);
    return res.body;
  });
}
...