Проверка данных из запросов

Библиотека Validator.js используется для валидации строковых данных в Node.js и браузере. Чаще всего применяется при обработке HTTP-запросов: проверке email, телефонов, URL, UUID, дат, IP-адресов, числовых значений и пользовательского ввода из форм.

Официальный сайт: Validator.js

Установка

Node.js

npm install validator

Импорт библиотеки

CommonJS:

const validator = require('validator');

ES Modules:

import validator fr om 'validator';

Основы проверки данных

Большинство методов Validator.js принимают строку и возвращают true или false.

Пример:

import validator fr om 'validator';

const email = 'admin@example.com';

console.log(validator.isEmail(email));

Результат:

true

Если значение не соответствует формату:

console.log(validator.isEmail('invalid-email'));

Результат:

false

Проверка данных из Express-запросов

На практике данные обычно приходят через:

  • req.body
  • req.query
  • req.params
  • req.headers

Пример Express-приложения:

import express fr om 'express';
import validator fr om 'validator';

const app = express();

app.use(express.json());

app.post('/register', (req, res) => {
    const { email } = req.body;

    if (!validator.isEmail(email)) {
        return res.status(400).json({
            error: 'Некорректный email'
        });
    }

    res.json({
        success: true
    });
});

Проверка обязательных полей

Validator.js работает только со строками, поэтому перед проверкой необходимо учитывать undefined, null и другие типы.

Пример ошибки:

validator.isEmail(undefined);

Возникнет исключение:

TypeError

Безопасная проверка:

if (!email || !validator.isEmail(email)) {
    return res.status(400).json({
        error: 'Некорректный email'
    });
}

Проверка пустых строк

Метод isEmpty() проверяет, является ли строка пустой.

validator.isEmpty('');

Результат:

true

Однако строка из пробелов не считается пустой:

validator.isEmpty('   ');

Результат:

false

Для удаления пробелов используется trim():

validator.isEmpty('   '.trim());

Результат:

true

Проверка поля имени:

const name = req.body.name;

if (!name || validator.isEmpty(name.trim())) {
    return res.status(400).json({
        error: 'Имя обязательно'
    });
}

Санитизация данных

Validator.js содержит функции очистки данных.

trim()

Удаляет пробелы по краям строки.

const value = validator.trim('   admin   ');

console.log(value);

Результат:

admin

escape()

Экранирует HTML-символы.

validator.escape('<script>alert(1)</script>');

Результат:

&lt;script&gt;alert(1)&lt;/script&gt;

Полезно при защите от XSS.


Проверка email

Базовая проверка

validator.isEmail('user@gmail.com');

Проверка с настройками

validator.isEmail('admin@test.com', {
    allow_utf8_local_part: false,
    require_tld: true
});

Основные опции

Опция Описание
allow_display_name Разрешает John <john@mail.com>
require_tld Требует доменную зону
allow_utf8_local_part Разрешает UTF-8 символы
ignore_max_length Игнорирует ограничение длины

Проверка пароля

Validator.js не содержит отдельной функции проверки сложности пароля, но предоставляет инструменты для этого.

Проверка длины

validator.isLength(password, {
    min: 8,
    max: 64
});

Проверка наличия цифр

validator.matches(password, /\d/);

Проверка заглавных букв

validator.matches(password, /[A-Z]/);

Комплексная проверка

function validatePassword(password) {
    if (!validator.isLength(password, { min: 8 })) {
        return 'Минимум 8 символов';
    }

    if (!validator.matches(password, /\d/)) {
        return 'Нужна хотя бы одна цифра';
    }

    if (!validator.matches(password, /[A-Z]/)) {
        return 'Нужна заглавная буква';
    }

    return null;
}

Проверка чисел

Целые числа

validator.isInt('42');

Проверка диапазона

validator.isInt('25', {
    min: 18,
    max: 60
});

Проверка float

validator.isFloat('19.99');

Проверка decimal

validator.isDecimal('99.95');

Проверка возраста

const age = req.body.age;

if (!validator.isInt(age, { min: 18 })) {
    return res.status(400).json({
        error: 'Возраст должен быть не менее 18'
    });
}

Проверка URL

Базовая проверка

validator.isURL('https://example.com');

Проверка HTTPS

validator.isURL('https://example.com', {
    protocols: ['https'],
    require_protocol: true
});

Запрет localhost

validator.isURL(url, {
    require_protocol: true,
    require_host: true,
    allow_protocol_relative_urls: false,
    allow_fragments: true,
    allow_query_components: true
});

Проверка UUID

validator.isUUID('550e8400-e29b-41d4-a716-446655440000');

Определённая версия:

validator.isUUID(id, 4);

Проверка JWT

validator.isJWT(token);

Пример:

if (!validator.isJWT(token)) {
    return res.status(401).json({
        error: 'Некорректный токен'
    });
}

Следует учитывать, что метод проверяет формат токена, а не его подпись.


Проверка JSON

validator.isJSON('{"name":"Alex"}');

Проверка даты

Проверка формата

validator.isDate('2025-05-11');

Проверка ISO8601

validator.isISO8601('2025-05-11T12:00:00Z');

Проверка IP-адресов

IPv4

validator.isIP('192.168.1.1', 4);

IPv6

validator.isIP('2001:db8::1', 6);

Проверка телефона

Validator.js содержит метод isMobilePhone().

validator.isMobilePhone('+77001234567', 'kk-KZ');

Можно использовать локали:

validator.isMobilePhone(phone, ['ru-RU', 'kk-KZ']);

Проверка slug

Slug — URL-безопасная строка.

validator.isSlug('my-awesome-post');

Проверка hexadecimal

validator.isHexadecimal('ff00aa');

Проверка кредитных карт

validator.isCreditCard('4111111111111111');

Для реальных платежей такой проверки недостаточно — необходима интеграция с платёжными системами.


Проверка MongoDB ObjectId

Validator.js не содержит встроенной проверки ObjectId, но можно использовать регулярное выражение.

const isObjectId = validator.matches(
    id,
    /^[0-9a-fA-F]{24}$/
);

Проверка данных query-параметров

Пример:

GET /users?page=2&limit=20

Проверка:

app.get('/users', (req, res) => {
    const { page, lim it } = req.query;

    if (page && !validator.isInt(page, { min: 1 })) {
        return res.status(400).json({
            error: 'Некорректный page'
        });
    }

    if (lim it && !validator.isInt(lim it, {
        min: 1,
        max: 100
    })) {
        return res.status(400).json({
            error: 'Некорректный lim it'
        });
    }

    res.json({
        success: true
    });
});

Проверка route params

Маршрут:

GET /users/:id

Проверка UUID:

app.get('/users/:id', (req, res) => {
    const { id } = req.params;

    if (!validator.isUUID(id)) {
        return res.status(400).json({
            error: 'Некорректный ID'
        });
    }

    res.json({
        success: true
    });
});

Нормализация email

Метод normalizeEmail() приводит email к стандартизированному виду.

const email = validator.normalizeEmail(
    'Admin@GMAIL.COM'
);

console.log(email);

Результат:

admin@gmail.com

blacklist и whitelist

whitelist()

Разрешает только определённые символы.

validator.whitelist('abc123', 'a-z');

Результат:

abc

blacklist()

Удаляет запрещённые символы.

validator.blacklist('hello<script>', '<>');

Результат:

helloscript

Создание собственного валидатора

function validateUser(data) {
    const errors = {};

    if (!data.email || !validator.isEmail(data.email)) {
        errors.email = 'Некорректный email';
    }

    if (!data.password ||
        !validator.isLength(data.password, { min: 8 })) {

        errors.password = 'Слишком короткий пароль';
    }

    return {
        isValid: Object.keys(errors).length === 0,
        errors
    };
}

Использование:

const result = validateUser(req.body);

if (!result.isValid) {
    return res.status(400).json(result.errors);
}

Централизованная схема валидации

Пример универсального валидатора:

const rules = {
    email: value => validator.isEmail(value),
    age: value => validator.isInt(value, { min: 18 }),
    username: value => validator.isLength(value, {
        min: 3,
        max: 20
    })
};

function validate(data, rules) {
    const errors = {};

    for (const field in rules) {
        const isValid = rules[field](data[field]);

        if (!isValid) {
            errors[field] = 'Некорректное значение';
        }
    }

    return errors;
}

Валидация массива ошибок

function validate(data) {
    const errors = [];

    if (!validator.isEmail(data.email)) {
        errors.push({
            field: 'email',
            message: 'Некорректный email'
        });
    }

    if (!validator.isLength(data.password, {
        min: 8
    })) {
        errors.push({
            field: 'password',
            message: 'Короткий пароль'
        });
    }

    return errors;
}

Преобразование типов

Validator.js не приводит типы автоматически.

Неправильно:

validator.isInt(25);

Правильно:

validator.isInt(String(25));

При работе с запросами Express это обычно не проблема, так как данные приходят строками.


Защита от неожиданных типов

Безопасная проверка:

function toString(value) {
    if (value === null || value === undefined) {
        return '';
    }

    return String(value);
}

Использование:

validator.isEmail(toString(req.body.email));

Использование вместе с middleware

function validateEmail(req, res, next) {
    const { email } = req.body;

    if (!email || !validator.isEmail(email)) {
        return res.status(400).json({
            error: 'Некорректный email'
        });
    }

    next();
}

Подключение:

app.post(
    '/register',
    validateEmail,
    controller
);

Асинхронная валидация

Validator.js выполняет только синхронные проверки.

Для проверки уникальности пользователя:

app.post('/register', async (req, res) => {
    const { email } = req.body;

    if (!validator.isEmail(email)) {
        return res.status(400).json({
            error: 'Некорректный email'
        });
    }

    const exists = await User.findOne({
        email
    });

    if (exists) {
        return res.status(400).json({
            error: 'Email уже используется'
        });
    }

    res.json({
        success: true
    });
});

Типичные ошибки

Отсутствие trim()

Ошибка:

validator.isEmail(' admin@gmail.com ');

Результат:

false

Правильно:

validator.isEmail(
    validator.trim(email)
);

Проверка без существования значения

Ошибка:

validator.isEmail(req.body.email);

Если поле отсутствует — приложение упадёт.


Доверие только frontend-валидации

Проверка в браузере не заменяет серверную валидацию. Любой HTTP-запрос может быть отправлен вручную через Postman, curl или скрипт.


Практический пример полной проверки регистрации

import validator from 'validator';

function validateRegister(data) {
    const errors = {};

    const email = validator.trim(
        String(data.email || '')
    );

    const password = String(data.password || '');

    const username = validator.trim(
        String(data.username || '')
    );

    if (!validator.isEmail(email)) {
        errors.email = 'Некорректный email';
    }

    if (!validator.isLength(password, {
        min: 8,
        max: 64
    })) {
        errors.password =
            'Пароль должен содержать от 8 до 64 символов';
    }

    if (!validator.matches(password, /\d/)) {
        errors.password =
            'Пароль должен содержать цифру';
    }

    if (!validator.isLength(username, {
        min: 3,
        max: 20
    })) {
        errors.username =
            'Имя пользователя должно быть от 3 до 20 символов';
    }

    if (!validator.matches(username, /^[a-zA-Z0-9_]+$/)) {
        errors.username =
            'Допустимы только буквы, цифры и _';
    }

    return {
        errors,
        isValid: Object.keys(errors).length === 0
    };
}

Интеграция с Express middleware

function registerValidator(req, res, next) {
    const result = validateRegister(req.body);

    if (!result.isValid) {
        return res.status(400).json({
            errors: result.errors
        });
    }

    next();
}

Использование:

app.post(
    '/register',
    registerValidator,
    registerController
);

Производительность и ограничения

Validator.js:

  • очень быстро работает со строками;
  • не требует сложной конфигурации;
  • подходит для REST API;
  • хорошо интегрируется с Express;
  • удобен для middleware.

Ограничения:

  • отсутствует встроенная схема валидации;
  • нет асинхронных правил;
  • не поддерживаются вложенные структуры объектов;
  • не выполняется автоматическое преобразование типов;
  • сложные формы требуют дополнительной архитектуры.

Когда использовать Validator.js

Validator.js особенно удобен в следующих случаях:

  • проверка REST API;
  • Express middleware;
  • небольшие и средние проекты;
  • микросервисы;
  • ручная серверная валидация;
  • санитизация пользовательского ввода;
  • проверка query и route params.

Для сложных схем часто используются дополнительные библиотеки:

  • Joi
  • Yup
  • Zod
  • express-validator

Однако Validator.js остаётся одной из самых популярных низкоуровневых библиотек для проверки строковых данных в JavaScript и Node.js.