nestjs使用pipe的whitelist后classvalidator如何定义可选字段?

作者站长头像
站长
· 阅读数 6
app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
    }),
  );
import {  IsNotEmpty, IsString } from 'class-validator';

export class SignupUserDto {
  @IsString()
  @IsNotEmpty()
  username: string;

  password?: string;
}

上面的password是非必填,按照上面的写法,如果填了password,controller中拿不到password的值。

只有加上一个注解才可以。加上注解如果不传,又会提示password必须是字符串,怎么搞?

回复
1个回答
avatar
test
2024-07-03

没太理解你的需求,你开启了 whitelist 不就是主动丢弃了没加装饰器的字段了?但是你还不想丢弃?那你干嘛要开启它呢?

非要这么拧巴的话那你就也加个装饰器,同时指定仅当字段不为空时才验证吧:

import { ValidateIf, IsString } from 'class-validator';

@ValidateIf(dto => dto.password != null)
@IsString()
password?: string;

也可以写成:

import { IsOptional, IsString } from 'class-validator';

@IsOptional()
@IsString()
password?: string;
https://github.com/typestack/class-validator#validation-decorators

两者是等效的。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容