Как я могу исправить ошибку «Не удается разрешить ссылку» при ссылке на $ id в том же документе?

#javascript #jsonschema #ajv

#javascript #jsonschema #ajv

Вопрос:

Я хочу проверить JSON на соответствие схеме JSON с Ajv в JavaScript. Я получаю сообщение об ошибке:

создайте новый.Ошибка MissingRefError(it.BaseID, $schema, $message); ^ Ошибка: не удается разрешить ссылку #/definitions/requestGraph из id requestGetGraphs

При удалении ссылки на другую схему: { «$ref»: «#/definitions/requestGraph» } ошибка исчезает.

JavaScript-код:

 ajv.addSchema(require('./json-schema/graph-response'), 'graph-response.json');
ajv.validate('requestGetGraphs', `{"type" : "requestGetGraphs", "space" : "config", "v" : 1.1, "id" : "dsaf" }`);
 

graph-request.json:

 {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id" : "graph-requests.json",
  "definitions": {
    "requestGraph" : {
      "$id" : "#/definitions/requestGraph",
      "allOf" : [
        { "$ref" : "call.json/#/definitions/request" },
        {
          "properties": {
            "space": {
              "$id" : "#requestGraph/properties/space",
              "type": "string",
              "const": "config"
            }
          }
        }
      ]
    }
  },
  "requestGetGraphs" : {
      "$id" : "requestGetGraphs",
      "type" : "object",
      "allOf" : [
        {
          "properties": {
            "action": {
              "$id" : "#requestGetGraphs/properties/action",
              "type": "string",
              "const": "requestGetGraphs"
            }
          }
        },
        { "$ref" : "#/definitions/requestGraph" }
      ]

    }

}
 

Ответ №1:

Если вы здесь из-за @typescript-eslint связанной ошибки сборки can't resolve reference #/definitions/directiveConfigSchema from id # , которая вчера появилась неожиданно, просто понизьте «@typescript-eslint / eslint-plugin» до версии «5.33.0». Если у вас его нет в вашем package.json, просто добавьте его (без ^ в версии). Удалите yarn.lock , package-lock.json и node_modules и перестройте.

Дополнительная информация на https://github.com/typescript-eslint/typescript-eslint/issues/5525

Комментарии:

1. Я прокомментировал эту тему, потому что это был первый результат, когда вы обнаружили ошибку в Google.

2. Кажется, последняя версия нуждается в исправлении. Просто поддержал ваш ответ.

3. Подтвердите, что это исправление работает

4. Обновите v5.35.1 , чтобы использовать @typescript-eslint исправление пакета

Ответ №2:

Это связано с разрешением URI. Проверьте https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-01#section-8.2.2

Когда «$ id» задает базовый URI, объект, содержащий этот «$ id» и все его подсхемы, может быть идентифицирован с помощью
фрагмента указателя JSON, начинающегося с этого местоположения. Это верно даже
для подсхем, которые дополнительно изменяют базовый URI. Таким образом, одна
подсхема может быть доступна несколькими URI, каждый из которых состоит из базового URI, объявленного в подсхеме или родительском, вместе с
фрагментом указателя JSON, идентифицирующим путь от объекта схемы, который объявляет
базу, до идентифицируемой подсхемы. Примеры этого
приведены в разделе 8.2.4.

Поскольку вы указали requestGetGraphs без хэша впереди, он разрешается как новая схема (потому что это не фрагмент). Добавление к вашему идентификатору $id хэша означает, что это идентификатор фрагмента, и разрешение URI происходит соответствующим образом.

Вы , наверное, тоже хотели свить гнездо requestGetGraphs внутри properties , верно?

Комментарии:

1. Ссылка находится внутри того же файла. Я также могу прочитать документацию для ajv. Но что не так с моим кодом?

2. Извините, я неправильно понял. Я посмотрю еще раз.

3. Спасибо, я решил эту проблему. Мне пришлось установить для основного корня значение «$id»: » example.com/graph-requests.json # » и поместите хэш перед идентификатором в requestGetGraphs. Затем мне пришлось выполнить проверку с помощью ref: graph-requests.json#/requestGetGraphs . Не могли бы вы удалить свой первый ответ? У меня уже есть эта теория, и другим будет легче читать этот пост.

4. Супер! Я удалю свой первый ответ и отредактирую заголовок вашего вопроса, чтобы лучше отразить вопрос.

5. Вам не нужно было устанавливать полный root $id, но это также хорошая практика.