Параметр dismissDefaultMessages относится к конфигурации
правил валидации и управляет тем, будут ли использоваться стандартные
сообщения ошибок, генерируемые библиотекой, или они будут подавляться в
пользу пользовательских сообщений либо пустого результата.
В обычной работе библиотеки каждое встроенное правило валидации
предоставляет сообщение по умолчанию. Например, при использовании
@IsEmail() без дополнительных параметров система сформирует
сообщение вида:
email must be an emailЭти сообщения формируются автоматически на основе внутренней логики валидаторов и отражают тип нарушения.
Стандартное поведение удобно в прототипировании, но в реальных приложениях часто требуется полный контроль над текстами ошибок, особенно при:
dismissDefaultMessages является частью объекта
ValidationOptions, который передаётся в декораторы
class-validator.
Основная задача параметра заключается в управлении тем, будет ли библиотека подставлять стандартное сообщение при отсутствии пользовательского.
interface ValidationOptions {
message?: string | ((validationArguments: ValidationArguments) => string);
groups?: string[];
always?: boolean;
each?: boolean;
context?: any;
dismissDefaultMessages?: boolean;
}
При валидации каждого правила происходит последовательная проверка:
Проверяется наличие пользовательского сообщения
(message)
Если сообщение задано — оно используется
Если сообщение отсутствует:
dismissDefaultMessages: false используется
стандартное сообщениеdismissDefaultMessages: true сообщение
подавляетсяТаким образом параметр влияет только на fallback-логику формирования текста ошибки.
@IsString()
name: string;
Результат при ошибке:
name must be a stringИспользуется стандартное сообщение.
@IsString({ dismissDefaultMessages: false })
name: string;
Поведение идентично дефолтному режиму. Явное значение не изменяет результат.
Сообщение остаётся:
name must be a string@IsString({ dismissDefaultMessages: true })
name: string;
В случае ошибки сообщение будет отсутствовать или заменено на пустую строку в зависимости от конфигурации pipeline обработки ошибок:
"" или undefinedВалидация фиксирует факт ошибки, но текст не формируется.
@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не формируются.
class-validator формирует структуру ошибки:
{
property: 'name',
constraints: {
isString: 'name must be a string'
}
}
При dismissDefaultMessages: true поведение меняется:
{
property: 'name',
constraints: {}
}
или
{
property: 'name',
constraints: undefined
}
В некоторых конфигурациях пайплайна такие ошибки могут фильтроваться на уровне трансформации ответа.
При использовании NestJS ValidationPipe параметр
особенно заметен:
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
transform: true
})
);
Если включено подавление сообщений, клиент получает:
constraintsЭто влияет на:
При построении многоязычных систем
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() может игнорироваться, если сообщение
не проброшено через messageValidationOptionsПри полном подавлении сообщений структура ошибок теряет информативность:
property сохраняетсяvalue может сохранятьсяconstraints становится пустымЭто приводит к необходимости внешней интерпретации ошибки, иначе теряется причина провала валидации.
{
dismissDefaultMessages: true,
message: () => 'Ошибка валидации'
}
Используется для унифицированного ответа API без детализации.
@IsString({ dismissDefaultMessages: true })
name: string;
@IsEmail({}, {
message: 'Некорректный email'
})
email: string;
В этом случае часть полей остаётся без текста, часть — с кастомными сообщениями.
При нескольких нарушениях одного поля:
@Length(5, 10, { dismissDefaultMessages: true })
@IsString({ dismissDefaultMessages: true })
username: string;
Результирующий объект может содержать:
constraintsПри этом библиотека не объединяет сообщения — каждое правило обрабатывается отдельно.
Хотя параметр не влияет на сам процесс валидации, он уменьшает объём генерируемых строк:
Эффект становится заметным при массовой валидации больших DTO.
messageПоведение строго ограничено слоем формирования текстовых сообщений.