Добавление пользовательских ключевых слов AJV автономно - PullRequest
0 голосов
/ 13 марта 2020

Я использую AJV для проверки моей JSON схемы. В настоящее время схема 'обязательна' из модуля и скомпилирована через экземпляр AJV. Я добавляю специальный валидатор (пользовательское ключевое слово на языке AJV) для проверки номера мобильного телефона в Великобритании. Мои файлы выглядят так:

main-service. js

const Ajv = require('ajv');
const AjvErrors = require('ajv-errors');
const templates = require('./templates');

const ajv = new Ajv({
    allErrors: true,
    jsonPointers: true,
    format: 'full',
    coerceTypes: true
});

AjvErrors(ajv);

ajv.addFormat('x-mobilePhoneNumber', mobilePhoneNumber => {
    return isValidMobilePhoneNumber(mobilePhoneNumber);
});

function someFunc(){
    const answers = {key: "answer"};
    const schema = templates['some-name'](id)
    const validate = ajv.compile(schema);
    const valid = validate(answers);
    *** Do some stuff with this ***
};

function isValidMobilePhoneNumber(number) {
    *** code to validate a phone number ***
};

шаблонов. js

const template = require('q-templates-application');  // this returns the JSON-Schema object.

module.exports = {
  'some-name': id => {
      template.id = id;
      return template;
}

Как только "шаблон" требуется, он содержит объект JSON -Schema, который будет использовать ключевое слово mobilePhoneNumber. Эта реализация работает и проверяет, как ожидается. Однако проблема, с которой я столкнулся, заключается в том, что в моем основном сервисе жестко задан пользовательский валидатор.

По сути, я хочу специальный код валидации (для номера мобильного телефона в данном случае, но также и для любых других валидаторов). Я выбираю добавить в будущем), который будет возвращен вместе с шаблоном, что позволит мне сохранять любые пользовательские проверки, прикрепленные к шаблону, и не придется жестко кодировать каждую из них.

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

  • main-service инициирует AJV
  • template требуется из шаблонов. js file
  • const template = require('q-templates-application') импортирует функцию вместо json -схемы объекта
  • функция проверяет, присутствуют ли дополнительные ключевые слова в схеме, или пользовательские ключевые слова перечислены отдельно
    • Если они есть, функция выполняет команду ajv.addFormat
    • Если нет ... это не так!
  • функция возвращает объект JSON -схемы

Я изо всех сил пытаюсь найти достойный способ сформулировать вышеизложенное, чтобы любые потенциальные решения, полные или частичные, были бы оценены!

...