Проверка данных в Node.js: Joi, Yup и Zod — выбираем правильный инструмент
В современной веб-разработке на Node.js проверка данных — это не просто хорошая практика, это необходимость. Без неё ваш сервер рискует получить неверные, вредоносные или неожиданные данные от клиента. Это может привести к ошибкам в логике приложений, уязвимостям безопасности (SQL-инъекции, XSS) и нестабильной работе. В этой статье мы рассмотрим три самые популярные библиотеки для проверки данных в среде Node.js: Joi, Yup и Zod. Вы узнаете об их особенностях, преимуществах и способах практического применения.
Зачем нужна серверная проверка данных?
Многие разработчики полагаются только на проверку на стороне клиента (например, используя атрибуты HTML5). Это ошибка. Проверку на стороне клиента легко обойти (отключив JavaScript или отправив запрос через Postman/curl). Серверная проверка — это последний рубеж защиты. Она гарантирует, что ваша бизнес-логика и база данных получат только те данные, которые соответствуют строгим требованиям: корректный тип, длина, формат (email, URL), обязательность полей и т.д.
1. Joi — проверенный ветеран
Joi (часто используется с фреймворком Hapi.js, но отлично работает и с Express/Koa) — одна из самых мощных и гибких библиотек. Она предоставляет богатый API для описания схем и сообщений об ошибках.
Установка:
npm install joiПример использования Joi для проверки регистрации пользователя:
const Joi = require('joi');
const schema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required() .messages({ 'string.min': 'Имя пользователя должно содержать минимум {#limit} символа(ов)', 'string.max': 'Имя пользователя должно содержать максимум {#limit} символа(ов)' }), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')) .required(), email: Joi.string() .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net', 'ru'] } }) .required(), birth_year: Joi.number() .integer() .min(1900) .max(2023)});
const validateUser = (data) => { const { error, value } = schema.validate(data, { abortEarly: false }); if (error) { // Возвращаем все ошибки return { valid: false, errors: error.details.map(d => d.message) }; } return { valid: true, data: value };};
// Пример вызоваconst result = validateUser({ username: 'jo', password: '123', email: 'test@test', birth_year: 1800});console.log(result.errors);// Вывод: ['Имя пользователя должно содержать минимум 3 символа(ов)', '"password" length must be at least 3 characters long', '"email" must be a valid email', '"birth_year" must be less than or equal to 2023']Преимущества Joi:
- Огромное количество встроенных валидаторов (email, URL, UUID, credit card, phone и т.д.).
- Поддержка условной проверки (when, switch).
- Отличные сообщения об ошибках с возможностью перевода и настройки.
- Детальная документация.
Недостатки Joi:
- Размер библиотеки (примерно 60 Кб в сжатом виде).
- API может показаться громоздким для простых схем.
- Сложная интеграция с TypeScript (требуются дополнительные типы).
2. Yup — простота и лаконичность
Yup изначально создавался для проверки форм в React (в связке с Formik), но также отлично работает и на сервере. Его главное преимущество — краткий и читаемый синтаксис, напоминающий схемы mongoose.
Установка:
npm install yupПример проверки массива объектов с помощью Yup:
const yup = require('yup');
cons