Параметр dismissDefaultMessages

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

В обычной работе библиотеки каждое встроенное правило валидации предоставляет сообщение по умолчанию. Например, при использовании @IsEmail() без дополнительных параметров система сформирует сообщение вида:

  • email must be an email

Эти сообщения формируются автоматически на основе внутренней логики валидаторов и отражают тип нарушения.

Стандартное поведение удобно в прототипировании, но в реальных приложениях часто требуется полный контроль над текстами ошибок, особенно при:

  • локализации
  • унификации API-ответов
  • скрытии внутренних деталей валидации
  • построении доменно-ориентированных сообщений

Назначение dismissDefaultMessages

dismissDefaultMessages является частью объекта ValidationOptions, который передаётся в декораторы class-validator.

Основная задача параметра заключается в управлении тем, будет ли библиотека подставлять стандартное сообщение при отсутствии пользовательского.

interface ValidationOptions {
  message?: string | ((validationArguments: ValidationArguments) => string);
  groups?: string[];
  always?: boolean;
  each?: boolean;
  context?: any;
  dismissDefaultMessages?: boolean;
}

Логика обработки сообщений

При валидации каждого правила происходит последовательная проверка:

  1. Проверяется наличие пользовательского сообщения (message)

  2. Если сообщение задано — оно используется

  3. Если сообщение отсутствует:

    • при dismissDefaultMessages: false используется стандартное сообщение
    • при dismissDefaultMessages: true сообщение подавляется

Таким образом параметр влияет только на fallback-логику формирования текста ошибки.

Поведение при различных конфигурациях

Без указания dismissDefaultMessages

@IsString()
name: string;

Результат при ошибке:

  • name must be a string

Используется стандартное сообщение.

dismissDefaultMessages: false

@IsString({ dismissDefaultMessages: false })
name: string;

Поведение идентично дефолтному режиму. Явное значение не изменяет результат.

Сообщение остаётся:

  • name must be a string

dismissDefaultMessages: true без message

@IsString({ dismissDefaultMessages: true })
name: string;

В случае ошибки сообщение будет отсутствовать или заменено на пустую строку в зависимости от конфигурации pipeline обработки ошибок:

  • "" или undefined

Валидация фиксирует факт ошибки, но текст не формируется.

dismissDefaultMessages: true с message

@IsString({
  dismissDefaultMessages: true,
  message: 'Некорректный тип значения'
})
name: string;

Приоритет всегда у пользовательского сообщения:

  • Некорректный тип значения

Параметр dismissDefaultMessages в этом случае не влияет на результат, так как fallback не используется.

Поведение в связке с другими валидаторами

Числовые валидаторы

@IsInt({ dismissDefaultMessages: true })
age: number;

При ошибке:

  • стандартное сообщение age must be an integer number подавляется
  • результат зависит от обработки ошибок на уровне ValidationPipe

Строковые ограничения

@Length(10, 20, { dismissDefaultMessages: true })
title: string;

Стандартные сообщения вида:

  • title must be longer than or equal to 10 characters

не формируются.

Влияние на структуру ValidationError

class-validator формирует структуру ошибки:

{
  property: 'name',
  constraints: {
    isString: 'name must be a string'
  }
}

При dismissDefaultMessages: true поведение меняется:

{
  property: 'name',
  constraints: {}
}

или

{
  property: 'name',
  constraints: undefined
}

В некоторых конфигурациях пайплайна такие ошибки могут фильтроваться на уровне трансформации ответа.

Практическое влияние на ValidationPipe

При использовании NestJS ValidationPipe параметр особенно заметен:

app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true,
    transform: true
  })
);

Если включено подавление сообщений, клиент получает:

  • структуру ошибки без текста
  • либо сокращённый объект без constraints

Это влияет на:

  • фронтенд-обработку ошибок
  • генерацию уведомлений
  • дебагging

Использование в сценариях локализации

При построении многоязычных систем dismissDefaultMessages часто применяется совместно с кастомным message resolver:

@IsEmail({}, {
  dismissDefaultMessages: true,
  message: ({ property }) => translate('validation.email', { field: property })
})
email: string;

В этом случае стандартные английские строки полностью исключаются, а система сообщений становится централизованной.

Взаимодействие с кастомными валидаторами

Для кастомных декораторов:

function IsCustomRule(options?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      target: object.constructor,
      propertyName,
      options,
      validator: {
        validate(value: any) {
          return value === 'valid';
        },
        defaultMessage() {
          return 'invalid value';
        }
      }
    });
  };
}

При dismissDefaultMessages: true:

  • defaultMessage() может игнорироваться, если сообщение не проброшено через message
  • итоговое поведение зависит от того, переопределяется ли сообщение явно в ValidationOptions

Особенности при отсутствии constraints

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

  • property сохраняется
  • value может сохраняться
  • constraints становится пустым

Это приводит к необходимости внешней интерпретации ошибки, иначе теряется причина провала валидации.

Типичные конфигурационные паттерны

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

{
  dismissDefaultMessages: true,
  message: () => 'Ошибка валидации'
}

Используется для унифицированного ответа API без детализации.

Частичное подавление через selective override

@IsString({ dismissDefaultMessages: true })
name: string;

@IsEmail({}, {
  message: 'Некорректный email'
})
email: string;

В этом случае часть полей остаётся без текста, часть — с кастомными сообщениями.

Поведение при множественных ошибках

При нескольких нарушениях одного поля:

@Length(5, 10, { dismissDefaultMessages: true })
@IsString({ dismissDefaultMessages: true })
username: string;

Результирующий объект может содержать:

  • несколько записей в constraints
  • либо пустую структуру при полном подавлении

При этом библиотека не объединяет сообщения — каждое правило обрабатывается отдельно.

Влияние на производительность и объём ответа

Хотя параметр не влияет на сам процесс валидации, он уменьшает объём генерируемых строк:

  • отсутствует создание message string
  • снижается размер payload ошибок
  • упрощается сериализация ответа

Эффект становится заметным при массовой валидации больших DTO.

Ограничения применения

  • не влияет на факт возникновения ошибки
  • не изменяет логику валидатора
  • не предотвращает выполнение других правил
  • не заменяет message
  • не работает как фильтр ошибок, а только как модификатор вывода

Поведение строго ограничено слоем формирования текстовых сообщений.