Одной из ключевых возможностей Ajv является механизм расширения языка JSON Schema за счёт пользовательских ключевых слов. Это позволяет внедрять собственную бизнес-логику прямо в процесс валидации без необходимости постобработки данных.
Регистрация нового ключевого слова выполняется через метод
addKeyword, который может принимать как простую
функцию-валидатор, так и полноценный объект конфигурации.
Базовая форма определения:
ajv.addKeyword({
keyword: 'isEven',
type: 'number',
validate: function (schema, data) {
return data % 2 === 0;
}
});
В этом примере вводится новое правило isEven, применимое
к числам. Такая конструкция позволяет интегрировать произвольные
проверки, сохраняя совместимость со стандартом JSON Schema.
Ajv компилирует схемы в JavaScript-функции. Пользовательские ключевые слова также могут участвовать в генерации кода, что критично для производительности.
ajv.addKeyword({
keyword: 'multipleOf5',
compile: () => {
return (data) => data % 5 === 0;
}
});
Компилируемая форма предпочтительнее для часто используемых правил, так как исключает интерпретацию на этапе выполнения.
Ajv поддерживает проверку форматов строк через ключевое слово
format. Помимо встроенных форматов, можно подключать и
расширять их поведение.
Расширение выполняется через addFormat:
ajv.addFormat('hexColor', {
type: 'string',
validate: (data) => /^#[0-9A-Fa-f]{6}$/.test(data)
});
Для стандартизированных форматов часто используется пакет расширений
ajv-formats, который добавляет поддержку email, uri,
date-time и других спецификаций.
Особенность форматов:
Ajv проектируется как модульная система, где функциональность расширяется через плагины.
Наиболее часто используемые расширения:
ajv-formats — набор стандартных форматовajv-errors — кастомизация сообщений об ошибкахajv-keywords — дополнительные ключевые слова JSON
Schemaimport addFormats from "ajv-formats";
addFormats(ajv);
С помощью ajv-errors можно задавать человекочитаемые
сообщения:
const schema = {
type: "number",
errorMessage: "Значение должно быть числом"
};
Такая возможность отделяет логику валидации от слоя представления ошибок.
Ajv позволяет не только проверять данные, но и модифицировать их в процессе валидации.
const ajv = new Ajv({ useDefaults: true });
Если в схеме указано:
{
"type": "object",
"properties": {
"role": {
"type": "string",
"default": "user"
}
}
}
Отсутствующее поле будет автоматически добавлено.
const ajv = new Ajv({ coerceTypes: true });
Это позволяет автоматически преобразовывать значения:
"42" → 42"true" → trueТакой режим особенно полезен при обработке данных из HTTP-запросов.
const ajv = new Ajv({ removeAdditional: true });
При использовании:
{
"type": "object",
"additionalProperties": false
}
лишние поля будут удалены из объекта, а не только помечены как ошибочные.
Механизм $data позволяет использовать значения из самого
объекта данных внутри схемы.
Пример:
{
"properties": {
"min": { "type": "number" },
"value": {
"type": "number",
"minimum": { "$data": "1/min" }
}
}
}
Здесь значение value проверяется относительно
min.
ajv.$data = trueAjv поддерживает асинхронные проверки через
async/await.
Для этого используется ключевое слово $async:
const schema = {
$async: true,
type: "string",
validate: async function (data) {
return await checkDatabase(data);
}
};
Если валидация асинхронная, результатом будет
Promise.
Особенность:
throwawait validate(data)Ajv формирует детализированный объект ошибок, который содержит:
instancePath)keyword)message)params)Пример структуры:
{
"instancePath": "/age",
"keyword": "minimum",
"message": "should be >= 18",
"params": { "comparison": 18 }
}
Режимы управления:
allErrors: true — сбор всех ошибокallErrors: false — остановка на первой ошибкеОдним из фундаментальных механизмов Ajv является предварительная компиляция схем в исполняемые функции JavaScript.
const validate = ajv.compile(schema);
validate(data);
Ajv автоматически кэширует скомпилированные схемы, если они идентичны по ссылке или содержимому.
Ajv может работать в строгом режиме, который выявляет:
const ajv = new Ajv({ strict: true });
При включении строгого режима ошибки проектирования схем становятся видимыми на этапе разработки, а не выполнения.
Ajv поддерживает несколько спецификаций:
Выбор версии влияет на доступные конструкции схемы и поведение ключевых слов.
Некоторые ключевые различия:
$id вместо id$recursiveRefХотя композиционные ключевые слова являются базовой частью JSON Schema, в Ajv они получают оптимизированную реализацию.
Все схемы должны быть валидны:
{
"allOf": [schema1, schema2]
}
Достаточно соответствия одной схемы.
Требуется соответствие ровно одной схеме.
Ajv оптимизирует порядок проверки, снижая количество вычислений.
Ajv поддерживает референсы $ref, позволяющие строить
модульные схемы.
const schema = {
$ref: "user.json"
};
Схемы могут регистрироваться в реестре:
ajv.addSchema(userSchema, "user.json");
Это создаёт централизованную систему схем, пригодную для крупных приложений.
Ajv включает несколько уровней оптимизации:
Дополнительные опции:
code: { es5: false } — использование современных
конструкцийinlineRefs: true — инлайн ссылокmessages: false — отключение генерации сообщенийAjv строго контролирует поля, не описанные в схеме:
additionalProperties: false — запретadditionalProperties: true — разрешениеПример:
{
"type": "object",
"additionalProperties": {
"type": "string"
}
}
Каждое дополнительное поле проверяется как строка.
Валидация в Ajv может выполнять не только проверку, но и трансформацию входного объекта.
Поддерживаемые механизмы:
Эти возможности превращают Ajv в инструмент не только проверки, но и нормализации данных перед дальнейшей обработкой.
Экземпляр Ajv хранит внутреннее состояние:
Множественные экземпляры позволяют изолировать контексты валидации, что важно для микросервисной архитектуры или плагинных систем.