Пользовательские сообщения

Validator.js поддерживает механизм пользовательских сообщений, позволяющий полностью управлять текстами ошибок, формируемыми при проверке данных. Этот механизм используется для повышения читаемости ошибок, внедрения локализации, унификации ответов API и отделения бизнес-логики валидации от представления сообщений.

Система сообщений валидации строится вокруг идеи разделения правил и текстов ошибок. Каждое правило проверки может быть связано с одним или несколькими сообщениями, которые формируются при его нарушении.

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

  • Разделение логики и текста: правила проверки описывают условия, сообщения описывают результат нарушения.
  • Контекстность: сообщение зависит от конкретного поля и типа ошибки.
  • Переопределяемость: стандартные сообщения могут быть заменены на любые пользовательские варианты.
  • Параметризация: сообщения могут содержать динамические значения (например, минимальную длину или допустимый диапазон).

Базовая переопределяемость сообщений

В простейшем варианте каждое правило сопровождается кастомным текстом:

import validator from 'validator';

const result = validator.isLength('abc', {
  min: 5
}, {
  message: 'Строка должна содержать не менее 5 символов'
});

Здесь сообщение заменяет стандартный текст ошибки, который библиотека формирует автоматически.

Структура сообщений при множественных правилах

При комбинированной валидации каждое правило может иметь собственное сообщение:

const rules = {
  password: [
    {
      rule: (value) => value.length >= 8,
      message: 'Пароль должен содержать минимум 8 символов'
    },
    {
      rule: (value) => /[A-Z]/.test(value),
      message: 'Пароль должен содержать хотя бы одну заглавную букву'
    }
  ]
};

Такая структура позволяет точно локализовать причину ошибки.

Использование динамических значений в сообщениях

Параметризация сообщений повышает их информативность. Значения подставляются из контекста проверки:

const minLength = 10;

const message = `Минимальная длина строки: ${minLength} символов`;

В более сложных сценариях используются шаблонные функции:

const messageBuilder = (min, max) =>
  `Значение должно быть от ${min} до ${max}`;

Локализация сообщений

Одним из ключевых сценариев является поддержка нескольких языков. Сообщения выносятся в отдельные словари:

const messages = {
  ru: {
    required: 'Поле обязательно для заполнения',
    email: 'Некорректный формат электронной почты'
  },
  en: {
    required: 'Field is required',
    email: 'Invalid email format'
  }
};

Выбор языка осуществляется на уровне конфигурации:

const locale = 'ru';
const message = messages[locale].required;

Централизованное хранилище сообщений

При масштабировании приложения сообщения выносятся в отдельный модуль:

export const errorMessages = {
  username: {
    required: 'Имя пользователя обязательно',
    minLength: 'Имя пользователя слишком короткое'
  },
  email: {
    required: 'Email обязателен',
    invalid: 'Email имеет неверный формат'
  }
};

Такой подход упрощает сопровождение и снижает дублирование текста.

Связь сообщений с правилами валидации

Каждое правило может ссылаться на ключ сообщения, а не на сам текст:

const rules = {
  email: {
    validator: (value) => value.includes('@'),
    messageKey: 'email.invalid'
  }
};

При выполнении проверки происходит резолв ключа в конкретный текст.

Переопределение стандартных сообщений

Библиотека предоставляет базовые сообщения, которые можно заменить глобально:

validator.setMessages({
  required: 'Это поле обязательно',
  min: 'Значение меньше допустимого'
});

Такой подход применяется для унификации поведения во всём приложении.

Формирование сообщений на основе контекста ошибки

Контекст ошибки может включать:

  • имя поля
  • текущее значение
  • параметры правила
  • тип ошибки

Пример генерации:

function buildMessage(field, rule, params) {
  return `Ошибка в поле ${field}: правило ${rule} нарушено`;
}

Множественные ошибки одного поля

При комплексной проверке одно поле может возвращать несколько сообщений:

const errors = [
  'Поле обязательно',
  'Минимальная длина 5 символов'
];

Такой формат используется для детального отображения состояния данных.

Форматирование сообщений

Сообщения могут содержать плейсхолдеры:

const template = 'Значение должно быть больше {min}';

function format(msg, params) {
  return msg.replace('{min}', params.min);
}

Это упрощает поддержку универсальных шаблонов.

Интеграция с объектами ошибок

Результат валидации часто структурируется:

{
  field: 'email',
  errors: [
    {
      rule: 'format',
      message: 'Некорректный email'
    }
  ]
}

Такой формат облегчает обработку на стороне API.

Приоритет сообщений

При конфликте нескольких источников сообщений применяется приоритет:

  1. локальное сообщение правила
  2. сообщение поля
  3. глобальное сообщение
  4. стандартное сообщение библиотеки

Это позволяет гибко управлять уровнем переопределения.

Использование функций вместо строк

Сообщения могут быть функциями:

const message = (value) =>
  `Недопустимое значение: ${value}`;

Это даёт возможность динамической генерации текста в зависимости от входных данных.

Стандартизация сообщений в больших проектах

В крупных системах применяется единый формат:

  • единый стиль формулировок
  • единая терминология
  • согласованные ключи ошибок
  • централизованные словари

Это снижает неоднозначность интерпретации ошибок и упрощает поддержку кода.

Обработка сообщений в API-ответах

Часто сообщения включаются в JSON-ответ:

{
  "status": "error",
  "errors": {
    "email": ["Некорректный формат email"]
  }
}

Такой формат используется для интеграции с фронтенд-валидацией.

Расширяемость системы сообщений

Система сообщений допускает расширение через:

  • пользовательские форматы
  • плагины валидации
  • middleware-подход
  • внешние словари локализации

Это позволяет адаптировать механизм под любые архитектуры приложений.