Валидация на стороне клиента выполняет функцию первичной проверки пользовательского ввода до отправки данных на сервер. Она снижает нагрузку на серверную часть, ускоряет обратную связь для пользователя и позволяет заранее отсеивать очевидно некорректные данные. При этом она не может рассматриваться как единственный механизм проверки, поскольку любой ввод, обработанный в браузере, может быть изменён или подделан.
В JavaScript одной из наиболее распространённых библиотек для строковой и формальной валидации является Validator.js. Она предоставляет набор чистых функций для проверки, нормализации и санитаризации входных данных.
Библиотека построена вокруг набора независимых функций, каждая из которых решает конкретную задачу. Основной принцип — отсутствие состояния и минимальная зависимость от внешнего контекста.
Пример подключения:
import validator from 'validator';
или в CommonJS:
const validator = require('validator');
Каждая функция принимает строку (или приводимое к строке значение) и
возвращает boolean либо преобразованное значение.
Одной из наиболее часто используемых функций является проверка пустоты строки:
validator.isEmpty('');
// true
validator.isEmpty('text');
// false
Важно учитывать, что пробелы по умолчанию не считаются пустым значением:
validator.isEmpty(' ');
// false
Для обработки подобных случаев часто используется предварительная нормализация:
validator.isEmpty(validator.trim(' '));
Validator.js предоставляет несколько методов для работы с числами:
validator.isNumeric('123'); // true
validator.isNumeric('12.3'); // false
Для более гибкой проверки можно использовать опции:
validator.isNumeric('12.3', { no_symbols: false });
Дополнительно:
validator.isInt('10'); // true
validator.isFloat('10.5'); // true
Ограничение длины — базовый элемент клиентской валидации:
validator.isLength('hello', { min: 3, max: 10 });
// true
Часто используется совместно с предварительной очисткой:
const value = validator.trim(input);
validator.isLength(value, { min: 5 });
Проверка email является одной из ключевых задач:
validator.isEmail('test@example.com');
// true
Функция поддерживает дополнительные настройки:
validator.isEmail('test@example.com', {
allow_utf8_local_part: true
});
Проверка ссылок:
validator.isURL('https://example.com');
// true
Расширенная конфигурация:
validator.isURL('example.com', {
require_protocol: true
});
// false
Проверка идентификаторов:
validator.isUUID('550e8400-e29b-41d4-a716-446655440000');
// true
Проверка строкового представления даты:
validator.isDate('2024-01-01');
// true
Помимо проверки, Validator.js предоставляет инструменты для преобразования данных.
validator.escape('<script>');
// <script>
Используется для предотвращения XSS-уязвимостей при отображении пользовательского ввода.
validator.trim(' text ');
// 'text'
Также доступна нормализация с указанием символов:
validator.trim('---text---', '-');
validator.normalizeEmail('Test@Example.com');
// test@example.com
Функция может приводить адреса к каноническому виду, включая удаление точек в Gmail (в зависимости от настроек):
validator.normalizeEmail('test.email@gmail.com', {
gmail_remove_dots: true
});
В реальных приложениях валидация редко ограничивается одной функцией. Обычно применяется композиция проверок:
function validateUser(data) {
const errors = [];
const email = validator.trim(data.email || '');
if (!validator.isEmail(email)) {
errors.push('Некорректный email');
}
const password = data.password || '';
if (!validator.isLength(password, { min: 8 })) {
errors.push('Пароль слишком короткий');
}
if (!validator.isStrongPassword(password)) {
errors.push('Пароль недостаточно сложный');
}
return errors;
}
Validator.js часто применяется для защиты логики интерфейса от неожиданных значений:
if (validator.isURL(userInput)) {
window.location.href = userInput;
}
const page = validator.isInt(query.page) ? query.page : 1;
Библиотека не ограничивает возможность создания собственных правил.
Пример комбинированной проверки телефона:
function isValidPhone(value) {
const v = validator.trim(value);
return validator.isLength(v, { min: 10, max: 15 }) &&
validator.isNumeric(v);
}
При использовании Validator.js на клиентской стороне необходимо учитывать:
validator.isEmail(undefined); // false, но без явной обработки может быть неожиданно
Корректный подход:
validator.isEmail(String(value || ''));
validator.isEmail(' test@example.com '); // false
Правильно:
validator.isEmail(validator.trim(value));
Любая логика, основанная исключительно на клиентской валидации, уязвима к обходу. Поэтому Validator.js рассматривается как часть многоуровневой системы проверки, а не как единственный фильтр.
Validator.js отличается минимальной нагрузкой на выполнение. Функции имеют линейную сложность и не создают значительных накладных расходов даже при массовой обработке данных.
В крупных интерфейсах библиотека часто используется в следующих сценариях:
Валидация на клиенте обычно связывается с состоянием интерфейса:
const emailValid = validator.isEmail(email);
setError(!emailValid ? 'Ошибка email' : '');
При этом часто применяется дебаунсинг:
setTimeout(() => {
validateField(value);
}, 300);
Validator.js включает дополнительные методы:
isAlpha — проверка буквенных строкisAlphanumeric — буквы и цифрыisBase64 — проверка кодированияisJWT — JSON Web TokenisSlug — URL-friendly строкиПример:
validator.isAlphanumeric('abc123');
// true
Использование Validator.js отличается от ручных регулярных выражений:
Однако в сложных бизнес-правилах часто требуется комбинация с собственными функциями.
Validator.js активно используется в связке с:
Пример в React:
const [email, setEmail] = useState('');
const isValid = validator.isEmail(email);
Часто применяется стратегия мгновенной обратной связи:
onChangeconst disabled = !validator.isEmail(email) ||
!validator.isLength(password, { min: 8 });
Для защиты интерфейса используется экранирование:
const safe = validator.escape(userComment);
Это особенно важно при отображении HTML-контента, поступающего от пользователя.
Несмотря на широкую функциональность, библиотека не решает следующие задачи:
Эти задачи требуют дополнительного уровня архитектуры.
В крупных приложениях Validator.js используется как низкоуровневый слой, поверх которого строятся схемы:
Пример структуры:
const rules = {
email: (v) => validator.isEmail(v),
password: (v) => validator.isLength(v, { min: 8 })
};