Библиотека Validator.js представляет собой набор чистых функций для проверки и нормализации строковых данных. В основе лежит функциональный подход: каждая проверка выполняет одну конкретную задачу и возвращает булево значение либо преобразованное значение. Это делает библиотеку предсказуемой, легко комбинируемой и независимой от фреймворков.
Основные сценарии применения связаны с проверкой пользовательского ввода: email, URL, числовых значений, строковых ограничений, форматов дат и идентификаторов. Библиотека не навязывает архитектуру, что позволяет строить различные стратегии валидации на уровне приложения.
Стратегия валидации на базе Validator.js часто строится через композицию функций. Каждая проверка рассматривается как отдельный этап обработки данных:
Такой подход позволяет выстраивать логические цепочки:
import validator from 'validator';
function validateEmail(input) {
const normalized = validator.trim(input);
if (!validator.isEmail(normalized)) {
return false;
}
return validator.normalizeEmail(normalized);
}
Композиционный стиль снижает связанность кода и позволяет легко изменять порядок или набор проверок без изменения всей логики.
Validator.js разделяет два ключевых процесса:
Такое разделение формирует устойчивую стратегию обработки ввода.
Пример:
const value = " TEST@MAIL.COM ";
const sanitized = validator.normalizeEmail(
validator.trim(value)
);
const isValid = validator.isEmail(sanitized);
Санитизация выполняется до проверки или после неё в зависимости от контекста. В системах с высокой нагрузкой предпочтение часто отдают предварительной нормализации, чтобы снизить количество ложных отрицательных результатов.
На сервере валидация выполняет роль последнего барьера защиты данных. Здесь Validator.js используется для строгой проверки входящих параметров API.
Основные принципы серверной стратегии:
Пример серверной проверки:
function validateUser(data) {
const errors = [];
if (!validator.isLength(data.username || '', { min: 3, max: 20 })) {
errors.push('username');
}
if (!validator.isEmail(data.email || '')) {
errors.push('email');
}
return {
valid: errors.length === 0,
errors
};
}
Серверная стратегия обычно предполагает централизованное хранилище правил, что позволяет переиспользовать их в разных API-эндпоинтах.
На клиенте валидация выполняет вспомогательную роль. Validator.js здесь используется для улучшения UX, но не заменяет серверную проверку.
Особенности клиентской стратегии:
Типичный пример:
function checkForm(email, password) {
return {
emailValid: validator.isEmail(email),
passwordValid: validator.isLength(password, { min: 8 })
};
}
Клиентская стратегия часто реализуется через события ввода и дебаунсинг, чтобы избежать избыточных вычислений.
В сложных приложениях возникает необходимость синхронизации правил между клиентом и сервером. Validator.js позволяет вынести логику в отдельный модуль:
export const rules = {
email: (v) => validator.isEmail(v),
password: (v) => validator.isLength(v, { min: 8 })
};
Такая структура обеспечивает:
Стратегия валидации включает не только проверку, но и формирование ошибок. Validator.js возвращает булевы значения, поэтому уровень обработки ошибок реализуется поверх библиотеки.
Распространённый подход — структурированные ошибки:
const errors = {};
if (!validator.isEmail(email)) {
errors.email = 'Некорректный формат email';
}
if (!validator.isLength(username, { min: 3 })) {
errors.username = 'Слишком короткое имя';
}
Такая структура облегчает интеграцию с UI и API-ответами.
Validator.js охватывает широкий набор стандартных проверок, однако бизнес-логика часто требует расширений. Стратегия расширения основана на композиции:
function isCorporateEmail(email) {
return validator.isEmail(email) && email.endsWith('@company.com');
}
Дополнительные проверки могут включать:
При построении стратегии важно учитывать стоимость последовательных проверок. Validator.js работает с строками, но частые вызовы функций могут быть избыточны при больших объёмах данных.
Оптимизация достигается через:
Пример раннего выхода:
if (!validator.isEmail(email)) return false;
if (!validator.isLength(password, { min: 8 })) return false;
В стратегиях валидации часто встречаются ошибки проектирования:
Особенно критичным считается дублирование логики между клиентом и сервером без единого модуля правил, что приводит к рассинхронизации поведения системы.