在UserController中增加用户时,@Body(CreateUserPipe) dto: CreateUserDto,但是roles字段获取不到

来源:11-9 管道:nestjs内置管道及如何使用自定义管道

qq_慕的地8145974

2023-10-16

CreateUserDto

export class CreateUserDto {
  @IsString()
  @IsNotEmpty()
  @Length(6, 20)
  username: string

  @IsString()
  @IsNotEmpty()
  @Length(6, 64)
  password: string

  roles?: Roles[] | number[]
}

CreateUserPipe

@Injectable()
export class CreateUserPipe implements PipeTransform {
  transform(value: CreateUserDto, metadata: ArgumentMetadata) {
    console.log(value, 'value-7')
    console.log(metadata, 'metadata')
    // if (value.roles&&value.roles instanceof Array && value.roles.length){
    //   if (value.roles[0]['id']){
    //     value.roles = value.roles.map(role => role.id)
    //   }
    // }
    return value;
  }
}

UserController

addUser(@Body(CreateUserPipe) dto: CreateUserDto) {
    console.log(dto, 'dto')
    const user = dto as User;
    console.log(user, '51')
    return this.userService.create(user);
  }

图片描述

图片描述

当我把UserController中@Body(CreateUserPipe) dto: CreateUserDto的dto类型改成any可以获取roles图片描述

写回答

2回答

守望星辰的旅人

2024-11-25

我今天也遇到相同的问题。找到几种解决方法:

  1. 和你一样把UserController中@Body(CreateUserPipe) dto: CreateUserDto的dto类型改成any

  2. 在 main.ts 中把 new ValidationPipe({ whitelist: true }) 中的 whitelist 注释掉

  3. 修改下 CreateUserDto,给roles属性加一个验证,比如 @IsArray()

export class CreateUserDto {
  @IsString()
  @IsNotEmpty()
  @Length(6, 20)
  username: string

  @IsString()
  @IsNotEmpty()
  @Length(6, 64)
  password: string
  @IsArray()
  roles?: Roles[] | number[]
}

我怀疑这个bug和 class-validator 的机制有关系,如果某个属性不写任何校验同时又指定了 whitelist 该属性就会被忽略。

1
0

Brian

2023-10-16

需要需要使用pipe,则需要在入口的main.ts中:

https://git.imooc.com/coding-617/nestjs-lesson/src/main/src/setup.ts#L22

1
0

NestJS 入门到实战 前端必学服务端新趋势

近几年快速发展的Node.js框架,掌握未来前端工程师后端开发能力

569 学习 · 238 问题

查看课程