Валидация данных в JavaScript (Node.js) с Joi и Yup

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Валидация данных в 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

Рекомендаций

КритерийJoiYup
ПроизводительностьВысокаяСредняя
Размер пакета~200 КБ~50 КБ