При разработке приложений на JavaScript валидация данных редко
ограничивается простым вызовом validator.isEmail() или
validator.isURL(). В реальных системах требуется:
Библиотека Validator.js предоставляет только функции проверки значений. Логирование необходимо реализовывать самостоятельно.
Самый базовый вариант — фиксировать успешную или неуспешную проверку.
const validator = require('validator');
function validateEmail(email) {
const isValid = validator.isEmail(email);
console.log({
field: 'email',
value: email,
valid: isValid,
timestamp: new Date().toISOString()
});
return isValid;
}
validateEmail('admin@example.com');
validateEmail('wrong-email');
Пример вывода:
{
field: 'email',
value: 'admin@example.com',
valid: true,
timestamp: '2026-05-11T10:00:00.000Z'
}
{
field: 'email',
value: 'wrong-email',
valid: false,
timestamp: '2026-05-11T10:00:01.000Z'
}
Чаще всего логируются только ошибки.
const validator = require('validator');
function validateUsername(username) {
if (!validator.isLength(username, { min: 3, max: 20 })) {
console.error('Ошибка валидации username:', username);
return false;
}
return true;
}
Такой подход уменьшает объём логов.
const validator = require('validator');
function logValidation(data) {
console.log(JSON.stringify(data, null, 2));
}
function validateEmail(email) {
const valid = validator.isEmail(email);
logValidation({
validator: 'isEmail',
value: email,
result: valid,
date: new Date().toISOString()
});
return valid;
}
function validationLogger({
field,
validatorName,
value,
result,
options = null
}) {
const payload = {
field,
validator: validatorName,
value,
result,
options,
timestamp: Date.now()
};
console.log(payload);
}
Использование:
const valid = validator.isLength(password, {
min: 8
});
validationLogger({
field: 'password',
validatorName: 'isLength',
value: password,
result: valid,
options: { min: 8 }
});
function validatePassword(password) {
const checks = [
{
name: 'length',
result: validator.isLength(password, { min: 8 })
},
{
name: 'uppercase',
result: /[A-Z]/.test(password)
},
{
name: 'number',
result: /\d/.test(password)
}
];
checks.forEach(check => {
console.log(check);
});
return checks.every(check => check.result);
}
function validateUser(user) {
const report = {
email: validator.isEmail(user.email),
login: validator.isLength(user.login, {
min: 3,
max: 20
}),
age: validator.isInt(String(user.age), {
min: 18
})
};
console.log(report);
return report;
}
Вывод:
{
email: true,
login: false,
age: true
}
Разделение сообщений по степени важности упрощает анализ логов.
function log(level, message, meta = {}) {
console.log({
level,
message,
meta,
timestamp: new Date().toISOString()
});
}
Пример:
if (!validator.isEmail(email)) {
log('warn', 'Некорректный email', {
field: 'email',
value: email
});
}
| Уровень | Назначение |
|---|---|
| info | Информация о проверке |
| warn | Ошибки пользовательского ввода |
| error | Критические ошибки |
| debug | Отладочная информация |
npm install winston
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
transports: [
new winston.transports.Console(),
new winston.transports.File({
filename: 'validation.log'
})
]
});
const validator = require('validator');
function validateEmail(email) {
const valid = validator.isEmail(email);
if (!valid) {
logger.warn('Ошибка email', {
field: 'email',
value: email
});
}
return valid;
}
npm install express morgan
const express = require('express');
const validator = require('validator');
const morgan = require('morgan');
const app = express();
app.use(express.json());
app.use(morgan('dev'));
app.post('/register', (req, res) => {
const { email } = req.body;
if (!validator.isEmail(email)) {
console.error('Неверный email:', email);
return res.status(400).json({
error: 'Invalid email'
});
}
res.json({
success: true
});
});
function validationMiddleware(field, validatorFn) {
return (req, res, next) => {
const value = req.body[field];
const result = validatorFn(value);
console.log({
field,
value,
result
});
if (!result) {
return res.status(400).json({
error: `Invalid ${field}`
});
}
next();
};
}
Использование:
app.post(
'/users',
validationMiddleware('email', validator.isEmail),
(req, res) => {
res.send('OK');
}
);
Неструктурированные сообщения:
Ошибка email admin@
Структурированные логи:
{
"field": "email",
"value": "admin@",
"validator": "isEmail",
"result": false
}
Структурированные данные:
function logValidation(data) {
console.log(JSON.stringify(data));
}
function validateRegistration(data) {
const steps = [];
const emailValid = validator.isEmail(data.email);
steps.push({
step: 'email',
result: emailValid
});
const passwordValid = validator.isLength(
data.password,
{ min: 8 }
);
steps.push({
step: 'password',
result: passwordValid
});
console.log(steps);
return steps.every(step => step.result);
}
function validateEmail(email) {
const start = performance.now();
const result = validator.isEmail(email);
const end = performance.now();
console.log({
validator: 'isEmail',
executionTime: `${end - start} ms`
});
return result;
}
const fs = require('fs').promises;
async function logToFile(data) {
await fs.appendFile(
'validation.log',
JSON.stringify(data) + '\n'
);
}
Использование:
async function validate(email) {
const valid = validator.isEmail(email);
await logToFile({
field: 'email',
value: email,
valid
});
return valid;
}
Нельзя записывать в логи:
Плохой пример:
console.log(password);
function maskPassword(password) {
return '*'.repeat(password.length);
}
Пример:
console.log({
password: maskPassword('secret123')
});
Результат:
{
password: '*********'
}
function maskEmail(email) {
const [name, domain] = email.split('@');
return `${name[0]}***@${domain}`;
}
function validationError(field, value) {
return {
type: 'ValidationError',
field,
value,
timestamp: Date.now()
};
}
if (!validator.isURL(url)) {
const error = validationError('url', url);
console.error(error);
}
// logger.js
module.exports = {
validation(field, value, result) {
console.log({
type: 'validation',
field,
value,
result
});
}
};
const logger = require('./logger');
logger.validation(
'email',
email,
validator.isEmail(email)
);
В production-среде чрезмерное логирование приводит к:
if (process.env.NODE_ENV !== 'production') {
console.log('Debug validation');
}
function debugValidation(field, value, result) {
console.debug({
field,
value,
result,
stack: new Error().stack
});
}
function isStrongPassword(password) {
return (
validator.isLength(password, { min: 8 }) &&
/[A-Z]/.test(password) &&
/\d/.test(password)
);
}
function isStrongPassword(password) {
const result = (
validator.isLength(password, { min: 8 }) &&
/[A-Z]/.test(password) &&
/\d/.test(password)
);
console.log({
validator: 'isStrongPassword',
result
});
return result;
}
function validateJson(json) {
try {
const parsed = JSON.parse(json);
console.log('JSON валиден');
return parsed;
} catch (error) {
console.error({
type: 'JSON_ERROR',
message: error.message
});
return null;
}
}
const validationErrors = [];
function addError(field, value) {
validationErrors.push({
field,
value,
date: Date.now()
});
}
if (!validator.isEmail(email)) {
addError('email', email);
}
const stats = {
success: 0,
failed: 0
};
function validate(email) {
const result = validator.isEmail(email);
result
? stats.success++
: stats.failed++;
return result;
}
console.log(stats);
const validationMap = new Map();
function validate(field, value, validatorFn) {
const result = validatorFn(value);
validationMap.set(field, result);
return result;
}
const crypto = require('crypto');
function createTraceId() {
return crypto.randomUUID();
}
const traceId = createTraceId();
console.log({
traceId,
field: 'email',
result: false
});
function auditValidation({
userId,
field,
value,
result
}) {
console.log({
userId,
field,
value,
result,
timestamp: Date.now()
});
}
const validator = require('validator');
function log(data) {
console.log(JSON.stringify(data, null, 2));
}
function validateRegistration(data) {
const traceId = crypto.randomUUID();
const checks = {
email: validator.isEmail(data.email),
password: validator.isLength(
data.password,
{ min: 8 }
),
age: validator.isInt(
String(data.age),
{ min: 18 }
)
};
log({
traceId,
checks,
timestamp: new Date().toISOString()
});
return Object.values(checks)
.every(Boolean);
}
validateRegistration({
email: 'admin@test.com',
password: 'secret123',
age: 25
});
console.log(req.body.password);
Ошибка безопасности.
console.log('Validation step 1');
console.log('Validation step 2');
console.log('Validation step 3');
Создаёт шум и затрудняет анализ.
console.log('Error');
Не содержит полезной информации.
Без timestamp сложно анализировать последовательность событий.
project/
├── validators/
├── middleware/
├── services/
├── logs/
├── logger/
│ ├── index.js
│ ├── validationLogger.js
│ └── errorLogger.js
class ValidationLogger {
static log(field, validatorName, value, result) {
console.log({
type: 'validation',
field,
validator: validatorName,
value,
result,
timestamp: Date.now()
});
}
static error(field, value) {
console.error({
type: 'validation_error',
field,
value
});
}
}
const valid = validator.isEmail(email);
ValidationLogger.log(
'email',
'isEmail',
email,
valid
);