Nest 在管道中去除DTO中没有的属性

文章讲述了在处理前端向后端提交的新角色创建请求时,由于前端不小心传入了未知字段如id,导致后端逻辑出错的问题。解决方案是通过在DTO中使用验证装饰器确保所有必需字段的正确性,并在Controller层或全局使用ValidationPipe,设置`whitelist`为`true`来过滤掉未定义的字段,从而保护了服务层的正常操作。
摘要由CSDN通过智能技术生成

需求

在角色表中,新增一条角色,此时前端不小心传入其他未知字段,例如id,此时影响到了后端的正常逻辑(在save方法时,传入id为空,会直接插入id为空的那行数据)。

一、DTO

此时,remark没有添加验证装饰器,此时dto会过滤到remark字段;id未定义,自然不会验证,想当于所有需要的数据,都需要添加验证装饰器(从’class-validator’引入)。

export class CreateRoleDto {

  @ApiProperty({ description: '角色名称', example: '管理员' })
  @Length(1, 15, { message: '角色名称只能为1-15个字符' })
  @IsNotEmpty({ message: '角色名称不能为空' })
  roleName: string;

  @ApiProperty({ description: '角色别名', example: '管理员' })
  @Length(1, 15, { message: '角色别名只能为1-15个字符' })
  @IsNotEmpty({ message: '角色别名不能为空' })
  roleAlias: string;

  @ApiProperty({ description: '角色顺序', example: 1 })
  @IsNotEmpty({ message: '角色顺序不能为空' })
  @IsNumber()
  order: number;

  @ApiProperty({ description: '角色状态 0启用 1禁用', enum: [0, 1] })
  @IsNotEmpty({ message: '角色状态不能为空' })
  @IsNumber()
  status: number;

  @ApiProperty({ description: '备注' })
  remark?: string;
}

二、Controller

此时前端传入数据:

{
  "id": "",
  "roleName": "1",
  "roleAlias": "1",
  "order": 1,
  "status": 0,
  "remark": "1"
}

局部处理:

  @Post('add')
  // whitelist	boolean	如果设置为 true ,验证器将去掉没有使用任何验证装饰器的属性的验证(返回的)对象
  @UsePipes(new ValidationPipe({ whitelist: true }))
  // 此时createRoleDto就自动剔除掉id、remark选项,也不会影响到Service层的save方法
  create(@Body() createRoleDto: CreateRoleDto) {
    return this.roleService.create(createRoleDto);
  }

全局处理:
在main.ts中使用:

  app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值