Joi — одна из наиболее известных библиотек валидации данных для JavaScript, активно применяемая в серверных приложениях на Node.js. Она используется для описания схем данных и проверки соответствия входящих значений заданным правилам. Основная идея Joi заключается в декларативном описании структуры данных и их ограничений.
Joi построена вокруг концепции схем (schemas). Каждая схема описывает ожидаемую структуру данных и набор ограничений:
Схема в Joi — это объект, к которому последовательно применяются методы-валидаторы.
Пример базовой схемы:
const Joi = require('joi');
const schema = Joi.object({
username: Joi.string().min(3).max(30).required(),
age: Joi.number().integer().min(0),
email: Joi.string().email()
});
Валидация в Joi выполняется через метод validate или
асинхронный validateAsync.
const result = schema.validate({
username: 'alex',
age: 25,
email: 'alex@mail.com'
});
Результат содержит:
value — нормализованные данныеerror — объект ошибки (если данные невалидны)При использовании validateAsync возвращается
Promise:
await schema.validateAsync(data);
Joi предоставляет богатый набор правил для строк:
Joi.string().pattern(/^[a-z]+$/).min(3).max(10)
Поддерживаются строгие числовые правила:
Joi.number().integer().min(10).max(100)
Joi позволяет строить сложные иерархии данных:
Joi.object({
user: Joi.object({
name: Joi.string(),
profile: Joi.object({
age: Joi.number(),
city: Joi.string()
})
})
});
Поддерживаются массивы с типизацией элементов:
Joi.array().items(Joi.string().email())
Joi позволяет задавать зависимости между полями:
Joi.object({
password: Joi.string(),
confirmPassword: Joi.any().valid(Joi.ref('password'))
})
Библиотека поддерживает:
Пример кастомной проверки:
const custom = Joi.string().custom((value, helpers) => {
if (!value.startsWith('ID-')) {
return helpers.error('string.invalidPrefix');
}
return value;
});
Joi не только проверяет данные, но и может:
Joi.number().default(10)
Yup — альтернативная библиотека валидации, вдохновлённая Joi, но ориентированная на более легковесное использование в клиентских приложениях, особенно в связке с React.
Yup также использует схематический подход, но имеет ряд архитектурных отличий:
Joi:
Yup:
Joi:
Yup:
Yup часто используется вместе с библиотеками управления формами:
Joi в этой области применяется реже и требует дополнительных адаптеров.
const schema = Joi.object({
email: Joi.string().email().required(),
age: Joi.number().min(18)
});
const schema = Yup.object({
email: Yup.string().email().required(),
age: Yup.number().min(18)
});
Синтаксически они близки, однако внутренние механизмы различаются.
Ошибка имеет структуру:
error.details[0].message
Ошибки чаще агрегируются и могут быть привязаны к полям формы:
error.inner
Joi.string().required().messages({
'string.empty': 'Поле обязательно'
});
Yup.string().required('Поле обязательно')
Yup делает акцент на встроенной читаемости сообщений.
Joi предпочтительнее, если:
Yup предпочтительнее, если:
Joi часто выступает частью серверной архитектуры, где валидация является первым уровнем защиты данных.
Yup, напротив, встроен в пользовательский интерфейс и работает ближе к точке ввода данных.
Разделение этих инструментов отражает общую архитектурную тенденцию: