Валидация данных в JavaScript (Node.js): Joi и Yup
В любом веб-приложении, особенно на Node.js, одна из ключевых задач — проверка входящих данных. Без валидации вы рискуете получить ошибки базы данных, уязвимости (SQL-инъекции, XSS) или некорректное поведение сервера. В этой статье мы рассмотрим две самые популярные библиотеки для валидации: Joi и Yup. Вы узнаете, как их устанавливать, создавать схемы и интегрировать с Express.
Зачем нужна валидация на сервере?
Клиентская валидация (HTML5 или JavaScript в браузере) — это удобно, но она легко обходится. Поэтому серверная проверка обязательна. Она гарантирует, что:
- Типы данных соответствуют ожидаемым (строка, число, массив).
- Обязательные поля не пустые.
- Данные не превышают допустимые размеры.
- Форматы (email, URL, телефон) корректны.
Библиотека Joi
Joi — мощный валидатор от создателей Hapi.js. Он поддерживает сложные схемы, кастомные сообщения об ошибках и асинхронные проверки.
Установка
npm install joi
Пример схемы для регистрации пользователя
const Joi = require('joi');
const userSchema = Joi.object({
username: Joi.string()
.alphanum()
.min(3)
.max(30)
.required()
.messages({
'string.min': 'Имя пользователя должно быть минимум 3 символа',
'string.max': 'Имя пользователя не должно превышать 30 символов'
}),
email: Joi.string()
.email({ tlds: { allow: false } })
.required(),
password: Joi.string()
.pattern(new RegExp('^[a-zA-Z0-9]{8,30}$'))
.required(),
birth_year: Joi.number()
.integer()
.min(1900)
.max(2024)
});
// Валидация
app.post('/register', (req, res) => {
const { error, value } = userSchema.validate(req.body, { abortEarly: false });
if (error) {
return res.status(400).json({
status: 'error',
message: error.details.map(d => d.message).join(', ')
});
}
res.json({ status: 'success', data: value });
});
Продвинутые возможности Joi
- Валидация массивов:
Joi.array().items(Joi.string()) - Условные правила:
.when('role', { is: 'admin', then: Joi.required() }) - Кастомные функции:
.custom((value, helpers) => { ... })
Библиотека Yup
Yup — лёгкая и интуитивная библиотека, популярная в экосистеме React (Formik). Но она отлично работает и на сервере.
Установка
npm install yup
Пример схемы для логина
const yup = require('yup');
const loginSchema = yup.object().shape({
email: yup.string()
.email('Введите корректный email')
.required('Email обязателен'),
password: yup.string()
.min(8, 'Пароль должен быть не менее 8 символов')
.max(50)
.required('Пароль обязателен')
});
// Middleware для Express
async function validateLogin(req, res, next) {
try {
const validatedData = await loginSchema.validate(req.body, { abortEarly: false });
req.validatedData = validatedData;
next();
} catch (err) {
res.status(400).json({
status: 'error',
errors: err.errors // массив сообщений об ошибках
});
}
}
app.post('/login', validateLogin, (req, res) => {
res.json({ status: 'success', data: req.validatedData });
});
Особенности Yup
- Асинхронная валидация по умолчанию (возвращает Promise).
- Трансформация данных:
.transform((value) => value.trim()) - Локализация ошибок — можно задать свои сообщения на русском.
Сравнение Joi и Yup
| Критерий | Joi | Yup |
|---|---|---|
| Производительность | Высокая | Средняя |
| Размер пакета | ~200 КБ | ~50 КБ |