Библиотека Validator.js активно используется для проверки строковых данных: email-адресов, URL, UUID, IP, номеров банковских карт, дат, JSON и множества других форматов. Несмотря на простоту API, ошибки при валидации встречаются регулярно:
Инструменты отладки позволяют быстро локализовать проблему, проверить промежуточные значения и определить причину неправильной работы валидатора.
Validator.js ориентирован на строковые данные. Большинство методов
ожидают string.
Ошибка:
import validator from 'validator';
const age = 25;
validator.isNumeric(age);
Результат:
TypeError: Expected a string but received a number
Отладка:
console.log(typeof age);
console.log(age);
Исправление:
validator.isNumeric(String(age));
Полезная практика:
function debugValue(value) {
console.log('Value:', value);
console.log('Type:', typeof value);
}
Частая проблема — пробелы, табуляция и невидимые символы.
Пример:
const email = 'test@mail.com ';
Проверка:
console.log(email.length);
console.log(JSON.stringify(email));
Результат:
"test@mail.com "
Использование JSON.stringify() помогает увидеть скрытые
символы.
Исправление:
validator.isEmail(email.trim());
const email = 'admin@test';
const result = validator.isEmail(email);
console.log({
value: email,
result
});
Вывод:
{
value: 'admin@test',
result: false
}
function validateEmail(email) {
console.log('Проверка email:', email);
const isValid = validator.isEmail(email);
console.log('Результат:', isValid);
return isValid;
}
Некоторые ошибки возникают не внутри Validator.js, а из-за неверных данных.
try {
const result = validator.isJSON(undefined);
console.log(result);
} catch (error) {
console.error(error.message);
}
try {
validator.isUUID(null);
} catch (error) {
console.error('Ошибка валидации');
console.error('Message:', error.message);
console.error('Stack:', error.stack);
}
Ошибка часто возникает в длинной цепочке условий.
Плохо:
if (
validator.isEmail(email) &&
validator.isLength(email, { min: 10 }) &&
validator.contains(email, '@company')
) {
// ...
}
Отладка затруднена.
Лучше:
const validEmail = validator.isEmail(email);
const validLength = validator.isLength(email, { min: 10 });
const hasCompany = validator.contains(email, '@company');
console.log({
validEmail,
validLength,
hasCompany
});
function validate(data) {
debugger;
return validator.isEmail(data);
}
Запуск:
node inspect app.js
При выполнении Node.js остановится на строке
debugger.
Запуск приложения:
node --inspect app.js
После запуска:
chrome://inspect
Возможности:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Validator Debug",
"program": "${workspaceFolder}/app.js"
}
]
}
Точки останова позволяют:
Пример анализа:
function validateUser(user) {
const email = user.email;
return validator.isEmail(email);
}
Breakpoint удобно ставить перед вызовом isEmail.
Многие методы Validator.js используют регулярные выражения.
const url = 'htp://site.com';
console.log(validator.isURL(url));
Результат:
false
Пошаговая диагностика:
console.log(url.startsWith('http'));
console.log(url.includes('://'));
const email = 'admin@localhost';
console.log(
validator.isEmail(email)
);
Если результат неожиданен, необходимо проверить опции.
Ошибка:
validator.isLength(password, {
min: '8'
});
min должен быть числом.
Диагностика:
console.log(typeof options.min);
Исправление:
validator.isLength(password, {
min: 8
});
validator.isAlpha('Привет');
Результат:
false
Причина — отсутствие локали.
Исправление:
validator.isAlpha('Привет', 'ru-RU');
Отладка:
console.log(validator.isAlpha('Привет', 'ru-RU'));
console.log(validator.isAlpha('Hello', 'en-US'));
Validator.js содержит методы очистки данных.
const value = ' <b>Hello</b> ';
const escaped = validator.escape(value);
console.log(escaped);
Вывод:
<b>Hello</b>
const value = ' admin ';
console.log(value.length);
const trimmed = validator.trim(value);
console.log(trimmed.length);
function debugValidator(name, fn, value, options) {
console.log('Validator:', name);
console.log('Value:', value);
console.log('Options:', options);
try {
const result = fn(value, options);
console.log('Result:', result);
return result;
} catch (error) {
console.error(error.message);
return false;
}
}
Использование:
debugValidator(
'isEmail',
validator.isEmail,
'admin@test.com'
);
Validator.js синхронен, однако часто используется внутри async-кода.
async function validateUser(user) {
console.log('START');
const result = validator.isEmail(user.email);
console.log('RESULT', result);
return result;
}
Promise.resolve(user)
.then(data => {
console.log(data);
return validator.isEmail(data.email);
})
.then(result => {
console.log(result);
});
Удобно для массовой диагностики.
const users = [
{ email: 'admin@test.com' },
{ email: 'wrong-email' },
{ email: 'user@gmail.com' }
];
const report = users.map(user => ({
email: user.email,
valid: validator.isEmail(user.email)
}));
console.table(report);
console.time('validation');
for (let i = 0; i < 100000; i++) {
validator.isEmail('admin@test.com');
}
console.timeEnd('validation');
Плохо:
users.forEach(user => {
validator.isEmail(user.email);
validator.isURL(user.website);
validator.isUUID(user.id);
});
При больших объёмах данных стоит:
app.post('/register', (req, res) => {
console.log(req.body);
const email = req.body.email;
const valid = validator.isEmail(email);
console.log(valid);
});
Ошибка:
validator.isEmail(req.body.email);
Если email отсутствует:
TypeError
Безопасная проверка:
const email = req.body.email || '';
validator.isEmail(email);
function validatePassword(password) {
const hasLength = validator.isLength(password, {
min: 8
});
const hasNumbers = validator.matches(
password,
/\d/
);
console.log({
hasLength,
hasNumbers
});
return hasLength && hasNumbers;
}
test('email validation', () => {
const email = 'wrong-email';
console.log(
validator.isEmail(email)
);
expect(
validator.isEmail(email)
).toBe(false);
});
const testCases = [
'',
' ',
null,
undefined,
'admin@test.com',
'wrong'
];
testCases.forEach(value => {
console.log({
value,
result: validator.isEmail(String(value || ''))
});
});
Ошибка:
validator.isEmail(123);
Исправление:
validator.isEmail(String(123));
Ошибка:
validator.isAlpha('Тест');
Исправление:
validator.isAlpha('Тест', 'ru-RU');
Ошибка:
validator.isLength(undefined, {
min: 1
});
Безопасный вариант:
validator.isLength(value || '', {
min: 1
});
Эффективнее проверять:
Плохо:
validateUserForm(data);
Лучше:
validator.isEmail('wrong-email');
Минимальный пример быстрее выявляет источник ошибки.
function logValidation(name, value, result) {
console.log({
validator: name,
value,
result,
time: new Date()
});
}
function safeValidate(fn, value, options = {}) {
try {
return fn(value, options);
} catch (error) {
console.error(error.message);
return false;
}
}
Использование:
safeValidate(
validator.isEmail,
user.email
);
logger.info({
validator: 'isEmail',
value: email,
result
});
logger.error({
error: error.message,
validator: 'isUUID'
});
const body = '{"name":"Alex"}';
console.log(
validator.isJSON(body)
);
const broken = '{"name":}';
console.log(
validator.isJSON(broken)
);
Результат:
false
const snapshot = {
input: email,
valid: validator.isEmail(email),
timestamp: Date.now()
};
console.log(snapshot);
Подобный подход помогает анализировать сложные ошибки в production-среде.
При использовании Validator.js в frontend-приложениях полезны:
form.addEventListener('submit', event => {
const email = input.value;
console.log(email);
if (!validator.isEmail(email)) {
event.preventDefault();
}
});
validator.isEmail('тест@почта.рф');
validator.isEmpty('');
validator.isEmpty(' ');
Корректнее:
validator.isEmpty(
validator.trim(' ')
);