我想创建一个nestjs应用程序,并且希望能够自定义类验证器的消息,所以我创建了一个函数来获取我提供给消息的键,然后返回自定义的消息,问题是我想得到最小我向 DTO 中的
@Min
装饰器提供的值;但它不存在于我得到的错误对象中exceptionFactory
。
这是 DTO:
class GetUsersDto {
@ApiProperty({ required: false })
@IsOptional()
@Min(1, { message: 'validation.min' })
@IsInt()
@Transform((param) => parseInt(param.value, 10))
page?: number;
}
app.useGlobalPipes(
new ValidationPipe({
stopAtFirstError: true,
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
exceptionFactory: (errors) => {
console.log(errors);
const result = errors
.map((error) => {
const key = Object.values(error.constraints)[0];
const message = getMessage(key, error);
return message ? message : getMessage('validation.400');
})
.join('');
return new BadRequestException(result);
},
}),
);
当我在异常工厂中记录错误时,我得到这样的信息:
[
ValidationError {
target: GetUsersDto { page: -1 },
value: -1,
property: 'page',
children: [],
constraints: { min: 'validation.min' }
}
]
我需要的是获得我提供给
@Min
的最小值(这里是1),但我得到了validation.min
。我怎样才能获得提供给@Min
的值?.
我们可以使用上下文,但是在两个地方提供相同的值很容易出错,并且添加上下文会让装饰器有点混乱。
您可以使用全局常量来表示该值。像这样:
const MIN_PAGE = 1
class GetUsersDto {
@ApiProperty({ required: false })
@IsOptional()
@Min(MIN_PAGE , { message: 'the min value page is:' + MIN_PAGE })
@IsInt()
@Transform((param) => parseInt(param.value, 10))
page?: number;
}
然后您就可以在任何您想要的地方使用该常量。您甚至可以使用单独的 constans.js 文件并将所有配置值存储在那里,然后将它们导入到您需要的任何地方。