NestJS中class-validator的@IsDateString不支持yyyy/MM/dd格式问题咨询
问题结论
class-validator的@IsDateString装饰器默认仅校验符合ISO 8601标准的日期字符串,标准格式要求使用短横线-作为日期分隔符,你收到的2021/04/19使用斜杠作为分隔符,确实不满足默认的校验规则,所以会抛出OpenDate must be a valid ISO 8601 date string报错。
可选用的解决方案
- 方案1:使用class-transformer的
@Transform装饰器预处理日期格式,替换分隔符后再校验,无需改动上游传参逻辑,代码修改量最小:
import { Transform } from 'class-transformer'; import { Expose, IsDateString, IsOptional } from 'class-validator'; export class CreateAccountProfileDto{ // 其余字段省略 @Expose() @Transform(({ value }) => { // 仅对字符串类型的入参做格式替换,避免空值/非字符串类型报错 if (typeof value === 'string') { return value.replace(/\//g, '-'); } return value; }) @IsDateString() @IsOptional() OpenDate: Date // 其余字段省略 }
- 方案2:自定义class-validator校验装饰器,直接适配斜杠分隔的日期格式,不需要修改原始入参:
可以按照class-validator的自定义校验规则写法,编写校验逻辑直接匹配YYYY/MM/DD格式的合法性,替换默认的@IsDateString装饰器即可。 - 方案3:调整上游传参格式,直接传递ISO 8601标准格式的日期字符串(如
2021-04-19),符合通用前后端接口规范,长期维护成本最低。
内容的提问来源于stack exchange,提问作者RRP
相关产品推荐
相关产品推荐

