在Nest.js接口请求体中如何为日期输入设置自定义格式?
在Nest.js中为请求体日期字段设置自定义格式
当然可以,在Nest.js里你可以借助class-transformer和class-validator这两个核心工具库,实现自定义日期格式(比如12.12.2022)的输入解析。下面是针对你提供的代码修改后的完整示例:
修改后的DTO代码
import { ApiProperty } from '@nestjs/swagger'; import { Transform, TransformFnParams } from 'class-transformer'; import { IsDate, IsOptional, Matches } from 'class-validator'; export class YourDtoName { // 替换成你的实际DTO类名 @ApiProperty({ example: 'ADMIN', description: '角色名称', }) readonly value: string; @ApiProperty({ example: 1, description: '用户ID', }) readonly id: number; @ApiProperty({ example: '12.12.2022', description: '角色过期日期', }) @IsOptional() // 先校验输入是否符合DD.MM.YYYY格式 @Matches(/^\d{2}\.\d{2}\.\d{4}$/, { message: '过期日期格式必须为DD.MM.YYYY' }) @IsDate({ message: '日期格式无效' }) // 将自定义格式字符串转换为Date对象 @Transform(({ value }: TransformFnParams) => { if (typeof value === 'string') { const [day, month, year] = value.split('.').map(Number); // 注意JavaScript的Date月份是0基索引,需要减1 return new Date(year, month - 1, day); } return value; }) readonly expireDate?: Date; }
关键配置说明
- 格式校验:通过
@Matches正则规则,强制要求输入字符串严格符合DD.MM.YYYY格式,避免无效格式进入转换环节。 - 日期转换:使用
@Transform装饰器自定义转换逻辑,拆分字符串为日、月、年,再构建成标准Date对象(注意月份要减1,因为JS的Date月份从0开始计数)。 - 全局管道配置:必须在
main.ts中开启验证管道的转换功能,否则class-transformer的逻辑不会生效:
import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ transform: true, // 开启自动转换请求体数据类型 whitelist: true, // 过滤DTO中未定义的字段 })); await app.listen(3000); } bootstrap();
这样配置后,客户端发送12.12.2022格式的日期字符串时,Nest.js会自动将其转换为Date对象绑定到expireDate字段;如果格式不符合要求,会直接返回明确的验证错误提示。
内容的提问来源于stack exchange,提问作者рагнарос повелитель огня
相关产品推荐
相关产品推荐

