NestJS DTO配置:searchTerm传值需最小长度3,默认空字符串
实现符合要求的searchTerm字段校验与转换
可以通过class-transformer的转换能力结合class-validator的校验规则,完全在DTO文件中实现需求。核心思路是先对传入的searchTerm值进行转换处理(不符合长度要求则转为空字符串),再针对性地执行长度校验。
最终DTO代码实现
import { ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, IsString, MinLength, ValidateIf } from 'class-validator'; import { Transform, Type } from 'class-transformer'; export class SearchDto { // 替换成你的DTO实际名称 @ApiPropertyOptional({ default: '' }) @IsOptional() @IsString() @Type(() => String) // 仅当searchTerm不为空字符串时,才校验最小长度 @ValidateIf((obj) => obj.searchTerm !== '') @MinLength(3) @Transform(({ value }) => { // 转换逻辑:传入字符串长度不足3则转为空,否则保留原值;非字符串也转为空 return typeof value === 'string' ? (value.length >= 3 ? value : '') : ''; }) searchTerm: string = ''; }
关键逻辑说明
- 默认值设置:给
searchTerm直接赋值= '',确保客户端未传入该字段时,值为空字符串。 - 转换处理:
@Transform装饰器在class-transformer的转换阶段优先处理传入值:- 如果是字符串且长度小于3,直接转为空字符串;
- 非字符串类型(比如客户端误传数字)也转为空,配合
@IsString保证类型合法性。
- 条件校验:
@ValidateIf配合@MinLength,仅当转换后的searchTerm不为空字符串时,才触发最小长度校验,避免空字符串触发校验错误。
这样既满足了「未传值默认空」「传值长度≥3则保留」「传值长度不足则设为空」的所有需求,同时保证了类型和长度的合法性校验。
内容的提问来源于stack exchange,提问作者ctaneja
相关产品推荐
相关产品推荐

