Режимы работы Ajv формируют поведение валидатора на трёх уровнях: этап компиляции схемы, этап выполнения валидации и этап формирования ошибок. Разница между режимами влияет на производительность, строгость проверки и предсказуемость результата.
Одним из ключевых механизмов является строгий режим, который управляет тем, насколько жёстко библиотека относится к некорректным или неоднозначным схемам.
В строгом режиме Ajv анализирует схему на этапе компиляции и выбрасывает ошибки при обнаружении:
Основная цель — выявить ошибки схемы до выполнения валидации данных.
Особенности поведения:
Пример эффекта строгого режима — ошибка при использовании несуществующего keyword:
const Ajv = require("ajv");
const ajv = new Ajv({ strict: true });
В таком режиме даже небольшие отклонения от стандарта приводят к исключениям.
В нестрогом режиме Ajv допускает:
Такой режим используется для совместимости со старыми проектами, где схемы могли быть написаны под ранние версии спецификации.
Особенности:
Ajv может работать в двух стратегиях обработки ошибок валидации.
В этом режиме проверка прекращается при первой найденной ошибке.
Характеристики:
Используется, когда важна производительность и достаточно знать факт невалидности данных.
При включении параметра allErrors валидатор продолжает
проверку всех правил, собирая полный список нарушений.
const ajv = new Ajv({ allErrors: true });
Особенности:
Разница между режимами особенно заметна на сложных вложенных схемах.
Ajv разделяет работу на два этапа: компиляция схемы и её выполнение.
При использовании compile схема преобразуется в
оптимизированную функцию:
const validate = ajv.compile(schema);
validate(data);
Особенности:
Этот режим считается основным в высоконагруженных системах.
Альтернативный подход:
ajv.validate(schema, data);
Здесь схема компилируется автоматически при каждом использовании или берётся из кеша.
Особенности:
Ajv использует генерацию JavaScript-кода для ускорения валидации.
В этом режиме логика проверки выполняется через универсальный валидатор.
Характеристики:
Используется редко, в основном для диагностики.
Основной режим Ajv основан на генерации специализированной функции под каждую схему.
Особенности:
Это фундаментальная оптимизация библиотеки.
Ajv может автоматически преобразовывать входные данные.
При включении этого режима значения приводятся к нужному типу:
const ajv = new Ajv({ coerceTypes: true });
Примеры преобразований:
"123" → число 123"true" → trueОсобенности:
В стандартном режиме типы проверяются строго:
"123" не равно числу 123;Такой режим обеспечивает предсказуемость данных.
Позволяет автоматически заполнять отсутствующие поля:
const ajv = new Ajv({ useDefaults: true });
Особенности:
Различают два варианта:
Управляет удалением лишних свойств:
false — игнорирование дополнительных полей;true — удаление всех лишних полей;"all" — удаление рекурсивно на всех уровнях.Особенности:
Ajv поддерживает разные версии спецификации:
Каждая версия вводит различия в:
$ref.Выбор версии влияет на:
Контролирует соответствие типов внутри схем:
Отдельный режим для массивов-кортежей:
Ajv поддерживает асинхронные ключевые слова, например проверку через внешние источники.
Пример поведения:
Ajv активно использует кеш компиляции схем.
Позволяет генерировать независимый код валидатора:
validate;allErrors;Различные режимы Ajv образуют систему компромиссов между:
Комбинация параметров определяет итоговое поведение валидатора и его применимость в конкретной архитектуре приложения.