在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
我今天也遇到相同的问题。找到几种解决方法:
和你一样把UserController中@Body(CreateUserPipe) dto: CreateUserDto的dto类型改成any
在 main.ts 中把 new ValidationPipe({ whitelist: true }) 中的 whitelist 注释掉
修改下 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 该属性就会被忽略。
10 -
Brian
2023-10-16
需要需要使用pipe,则需要在入口的main.ts中:
https://git.imooc.com/coding-617/nestjs-lesson/src/main/src/setup.ts#L2210
相似问题