需求
在角色表中,新增一条角色,此时前端不小心传入其他未知字段,例如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 }));