JSON-SCHEMA произвольные имена на верхнем уровне - PullRequest
0 голосов
/ 14 февраля 2019

Я использую json-схему с бэкэндом nodeJs под названием 'feathers-plus', который проверяет данные с помощью популярного ajv.

У меня есть два объекта -> ObjectA & ObjectB, где ObjectA является родителем.ObjectA содержит коллекцию ObjectB с произвольными именами, определенными patternProperties и объектами:

exchanges: {
  type: 'object',
  patternProperties: {
    "^[A-Za-z]+$": {
      type: 'object'
    }
  },
  additionalProperties: false
},

ObjectB (в моем случае это обмен) начинаются с этого имени произвольного ключа на верхнем уровне и затем содержатсамо по себе больше свойств (на втором уровне и т. д.).

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

"^[A-Za-z]+$": {
  type: 'object'
}

С помощью перьев плюс мы можем разделить наши логические объекты в сервисах.В моем случае, топ-сервис называется «конфиги», а дочерний «обменивается».

Любая помощь будет благодарна.

Спасибо!


РЕДАКТИРОВАТЬ: в соответствии с просьбой, я публикую свои текущие схемы для обоих объектов:

Родительский объект A ->

let schema = {
  title: 'Configs',
  description: 'Configs database.',

  required: [
    'name',
    'bot',
    'GUI',
    'ws',
    'createdAt',
    'updatedAt'
  ],

  uniqueItemProperties: [

  ],

  properties: {
    id: { type: 'ID' },
    name: {},
    pairs: {
      type: 'object',
      patternProperties: {
        "^[A-Za-z]+$": {
          type: 'object'
        }
      },
      additionalProperties: false
    },

    // THIS IS THE CONTAINER FOR EXCHANGES OBJECTS
    exchanges: {
      type: 'object',
      patternProperties: {
        "^[A-Za-z]+$": {
          type: 'object'
        }
      },
      additionalProperties: false
    },
    // END

    bot: {
      type: 'object',
      properties: {
        debug: { type: 'boolean' },
        gui: { type: 'boolean' },
        period_storage_ticker: { type: 'number' },
        interval_ticker_update: { type: 'number' },
        timeout_buy: { type: 'number' },
        timeout_sell: { type: 'number' },
        WATCH_MODE: { type: 'boolean' },
        TELEGRAM_ENABLED: { type: 'boolean' },
        TELEGRAM_NICK: {},
        TOKEN: {},
        chat_id: { type: 'number' }
      },
      required: [
        'debug',
        'gui',
        'period_storage_ticker',
        'interval_ticker_update',
        'timeout_buy',
        'timeout_sell',
        'WATCH_MODE',
        'TELEGRAM_ENABLED',
        'TELEGRAM_NICK',
        'TOKEN',
        'chat_id'
      ]
    },
    GUI: {
      type: 'object',
      properties: {
        enabled: { type: 'boolean' },
        start: { type: 'boolean' },
        port: { type: 'number' },
        https: { type: 'boolean' },
        key: {},
        cert: {},
        networktraffic: { type: 'boolean' },
        authentication: {
          type: 'object',
          properties: {
            login: { type: 'boolean' },
            twoFA: { type: 'boolean' }
          },
          required: [
            'login',
            'twoFA'
          ]
        },
        notifications: {
          type: 'object',
          properties: {
            trade: { type: 'boolean' },
            callback: { type: 'boolean' },
            error: { type: 'boolean' }
          },
          required: [
            'trade',
            'callback',
            'error'
          ]
        }
      },
      required: [
        'enabled',
        'start',
        'port',
        'https',
        'key',
        'cert',
        'networktraffic',
        'authentication',
        'notifications'
      ]
    },
    ws: {
      type: 'object',
      properties: {
        port: { type: 'number' },
        clientport: { type: 'number' },
        hostname: {}
      },
      required: [
        'port',
        'clientport',
        'hostname'
      ]
    }
    createdAt: {},
    updatedAt: {}
  }
}

Дочерний объектB ->

let schema = {
  title: 'Exchanges',
  description: 'Exchanges database.',

  // MY CURRENT EDIT (NOT WORKING)
  type: 'object',
  patternProperties: {
    "^[A-Za-z]+$": { type: 'boolean' }
  },
  additionalProperties: false,
  // END

  required: [

  ],

  uniqueItemProperties: [

  ],

  properties: {

  },
}

Если ясделать запрос и попытаться что-либо передать, это работает, и проверка не производится.Те же самые свойства patternProperties, установленные на более глубоком уровне, вообще не имеют проблем и проверены правильно.

...