更新用户数据的时候,在客户端要提供特定格式的数据,比如要提供用户当前的密码,还要提供要更新的用户名或者密码。
在项目里面先创建一个 dto ,放在 user/modules/update/dtos 里面,名字是 update-user.dto.ts。文件里定义并导出一个类,类的名字是 UpdateUserDto。
打开 UserUpdateController ,给这个更新用户接口的处理器添加一个参数,用 @Body 装饰一下,交给 body,类型设置成 UpdateUserDto。因为我们的应用在全局启用了 ValidationPipe,所以会验证这个 body 参数的值。
回到 UpdateUserDto,在里面添加一个 validate 属性,类型设置成 UpdateUserValidateDto,它是一个对象,里面应该包含用户当前的密码,在上面单独再定义一个类,名字是 UpdateUserValidateDto。
里面有一个 password 属性,类型是 string。然后可以设置一下验证规则,用一个 @IsNotEmpty ,设置一下选项参数里的 message,错误信息设置成 $property 必须提供用户密码,这个 $property 会被替换成这个属性的名字。
在上面再添加一个验证,用一下 Length ,最小是 6 位,最大是 24 位,一个选项参数,用 message 设置一下错误信息,$property 密码位数不对。
下面我们需要再设置一下这个 UpdateUserDto 里的 validate 这个属性的验证规则,先用一个 IsNotEmptyObject,一个对象参数,把 nullable 设置成 false,第二个参数是验证选项参数,用 message 设置一下错误信息,请提供验证数据。
上面再用一个 @Type 装饰器,提供一个函数参数,返回的东西是 UpdateUserValidateDto 。这个 Type 装饰器来自 class-transformer 这个包。
然后再用一个 @ValidateNested 装饰器,因为要验证的这个 validate 属性是一个嵌套对象,所以要验证这个属性嵌套的对象里的属性,需要使用一个 @ValidateNested 装饰器。另外还得再用 @Type 装饰器返回这个嵌套对象的类型。
测试
在 Http 客户端测试一下,直接发送一下更新用户请求,会提示请提供验证数据,配置一下这个请求的主体,类型是 JSON,准备一个 JSON 数据,里面要添加一个 validate 属性,它的值是一个对象,再发送一下这个请求,这次会提示必须提供用户密码,在这个对象里添加一个 password,它的值是一个字符串,发送一下请求,又提示密码位数不对,设置一下用户的密码。再发送一次这个请求,验证通过以后,服务端会响应一行文字, update user 。
update
回到项目,复制一份这个 UpdateUserDto 里的 validate 属性,再添加一个属性,名字改成 update ,类型设置成 UpdateUserUpdateDto,上面这个 @Type 返回的类型也设置成 UpdateUserUpdateDto 。
IsNotEmptyObject 错误信息改成请提供更新数据。
再复制一份上面定义的这个 UpdateUserValidateDto,定义一个新的类,名字是 UpdateUserUpdateDto,它里面也需要一个 password 属性,不过不同的是这个 password 是个可选的属性 ,也就是如果用户要修改密码的时候,可以在这个 update 里面包含 password,它的值就是修改之后的新的密码。
这里我们把 IsNotEmpty 换成一个 @IsOptional。 然后在上面再添加一个 name 属性,它也是一个可选的属性,类型是 string,用户如果要修改用户名,需要在 update 里面提供 name ,它的值就是修改之后的新的用户名。
用一个 @IsOptional 装饰一下,再用一个 @IsString 验证它的值是否是字符串。
测试
回到 Http 客户端,再发送一下这个更新用户请求,提示要提供更新数据,在这个请求主体里面,添加一个 update,它是一个对象,要修改用户名,需要在这个对象里添加一个 name 属性,设置一下属性的值,发送一下请求,这回就通过验证了。
如果想修改用户的密码,要在这个 update 里面包含一个 password,设置一下新的密码,发送一下请求,也可以通过数据验证。