В Joi параметры валидации определяют поведение проверки схемы, управление преобразованием данных, обработку ошибок и стратегию обработки неизвестных полей. Эти настройки применяются как на уровне отдельного вызова валидации, так и на уровне всей схемы, включая вложенные структуры.
Основной принцип заключается в том, что одна и та же схема может вести себя по-разному в зависимости от переданных опций, не меняя при этом своего описания. Это позволяет разделять структуру данных и правила её обработки.
Выполнение валидации в Joi осуществляется через метод
validate, которому может быть передан объект настроек:
const result = schema.validate(value, options);
Либо через встроенные настройки схемы:
const schema = Joi.object({
name: Joi.string()
}).options(options);
Параметры валидации могут задаваться на нескольких уровнях:
validate(value, options).options() или .prefs() у
схемыПри конфликте приоритет обычно отдается более локальному уровню:
параметры вызова validate перекрывают настройки схемы, а
настройки схемы перекрывают глобальные.
Одним из ключевых параметров является управление поведением при наличии полей, не описанных в схеме.
Параметр allowUnknown определяет, допускаются ли
дополнительные свойства в объектах:
Joi.object({
name: Joi.string()
}).validate(data, { allowUnknown: true });
Поведение:
true — неизвестные поля сохраняютсяfalse — неизвестные поля считаются ошибкойВ случае объектов параметр особенно важен для API, где структура данных может расширяться без изменения схемы.
Параметр stripUnknown управляет удалением лишних
полей:
Joi.object({
name: Joi.string()
}).validate(data, { stripUnknown: true });
Возможные режимы:
false — поля сохраняютсяtrue — удаляются все неизвестные поля{ objects: true } — рекурсивное удаление в глубине
объектовЭто позволяет использовать Joi не только как валидатор, но и как инструмент нормализации данных.
Параметр abortEarly влияет на стратегию обработки
ошибок:
const result = schema.validate(data, { abortEarly: false });
Поведение:
true — валидация прекращается после первой ошибкиfalse — собираются все ошибкиПри значении false результат содержит полный список
проблем, что особенно полезно для форм и пользовательских
интерфейсов.
Joi может автоматически преобразовывать входные данные в ожидаемые типы.
schema.validate(data, { convert: true });
Типичные преобразования:
При отключении:
{ convert: false }
значения проверяются строго без приведения типов, что важно для строгих API контрактов.
Параметр presence задаёт поведение обязательности полей
по умолчанию:
schema.validate(data, { presence: 'required' });
Возможные значения:
required — все поля обязательныoptional — поля по умолчанию необязательныforbidden — поля запрещеныЭтот параметр переопределяет поведение схемы, но не отменяет явно
заданные .required() или .optional().
Параметр context используется для передачи
дополнительных данных в генерацию сообщений об ошибках:
schema.validate(data, {
context: {
label: 'Пользователь'
}
});
Контекст может применяться в кастомных сообщениях:
Joi.string().messages({
'string.base': '{{#label}} должен быть строкой'
});
В результате {{#label}} подставляется из контекста.
Параметр messages позволяет переопределять стандартные
сообщения Joi:
schema.validate(data, {
messages: {
'string.empty': 'Поле не должно быть пустым',
'any.required': 'Поле обязательно'
}
});
Сообщения применяются глобально для текущего вызова валидации и перекрывают встроенные шаблоны.
Joi по умолчанию игнорирует функции и нестандартные структуры при валидации объектов. Это поведение может быть изменено через комбинацию параметров:
allowUnknownconvertФункции в объектах обычно исключаются из результата при использовании
stripUnknown.
Хотя строгий режим не является отдельной опцией в объекте настроек, он влияет на поведение преобразования:
schema.validate(data, { convert: false });
или через метод:
schema.strict();
В строгом режиме:
Joi позволяет задавать поведение по умолчанию для всех схем через базовую конфигурацию:
const base = Joi.defaults(schema => schema.options({
abortEarly: false,
stripUnknown: true
}));
Либо через создание преднастроенной версии схем:
const customJoi = Joi.defaults(schema => schema.options({
convert: false,
allowUnknown: false
}));
Такая конфигурация применяется ко всем схемам, созданным из этой базы.
Вложенные структуры наследуют параметры от родительской схемы:
const schema = Joi.object({
user: Joi.object({
name: Joi.string()
})
}).options({
abortEarly: false,
stripUnknown: true
});
Поведение:
Результат валидации при расширенных опциях содержит:
value — нормализованные данныеerror — объект ошибок (или null)warning — предупреждения (в некоторых
конфигурациях)При abortEarly: false структура ошибок включает массив
деталей, каждая из которых описывает конкретное нарушение.
Некоторые параметры влияют на скорость валидации:
convert: true увеличивает время обработки из-за
приведения типовabortEarly: false увеличивает нагрузку при ошибкахstripUnknown: true добавляет этап постобработки
объектаВ высоконагруженных системах часто используется минимальный набор преобразований и строгая схема.
Опции могут комбинироваться для получения различных стратегий обработки данных:
schema.validate(data, {
abortEarly: false,
allowUnknown: false,
stripUnknown: true,
convert: true,
presence: 'required'
});
Такая конфигурация задаёт:
Схемы могут иметь встроенные настройки:
const schema = Joi.object({
id: Joi.number(),
name: Joi.string()
}).options({
stripUnknown: true,
abortEarly: false
});
При этом вызов validate может дополнительно уточнить
поведение:
schema.validate(data, { convert: false });
Локальный параметр convert переопределит настройку
схемы, но не затронет остальные опции.
Опции в Joi формируют слой управления поведением между описанием данных и фактической обработкой входных значений. Схема определяет структуру, а параметры определяют стратегию интерпретации:
Такое разделение позволяет использовать одну и ту же схему в различных контекстах: API, формы, внутренние сервисы и интеграции.