You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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;
}

关键配置说明

  1. 格式校验:通过@Matches正则规则,强制要求输入字符串严格符合DD.MM.YYYY格式,避免无效格式进入转换环节。
  2. 日期转换:使用@Transform装饰器自定义转换逻辑,拆分字符串为日、月、年,再构建成标准Date对象(注意月份要减1,因为JS的Date月份从0开始计数)。
  3. 全局管道配置:必须在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,提问作者рагнарос повелитель огня

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:20:11