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

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.9k
1 个回答

没太理解你的需求,你开启了 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

两者是等效的。

推荐问题
logo
Microsoft
子站问答
访问
宣传栏