用户登录

更新用户密码要求用户提供当前的密码,还有新的密码,应用收到请求以后先要验证用户提供的当前密码是否跟我们存储的密码匹配,如果匹配就把用户提供的新的密码存储在这个用户的数据记录里面,不匹配可以报一个异常。

先打开 user.dto ,export 一个 class,名字是 UpdatePasswordDto,更新密码的时候传输的数据里面应该包含一个 password,类型是 string,它表示用户当前的密码,再添加一个 newPassword,类型也是 string,它是用户要更新的密码。

然后打开用户实体,添加一个比对密码用的方法,它是一个 async 方法,名字是 comparePassword,使用它的时候给它提供一个 password,类型是 string。

方法 return 的是 await 用一下 bcrypt 上提供的 compare ,比对的是 password 参数的值,还有 this.password ,表示当前实体里的 password 属性。

更新实体的时候也需要 Hash 一下密码,在 hashPassword 方法的上面,再添加一个 @BeforeUpdate ,这样更新实体的时候就会执行 hashPassword 去 Hash 用户的密码。

服务

在 User 服务里再添加一个更新密码的方法,添加一个 async 方法,名字是 updatePassword,方法接收一个 id 参数,类型是 string,还有一个 data 参数,类型是 UpdatePasswordDto。

在方法里面,先把 password,还有 newPassword,从 data 参数里面解构出来。

然后添加一个 entity,用一下 await,this.userRepository,findOne,找到指定 id 的用户实体。

做一下判断,如果没找到对应的用户实体,我们就 throw 一个异常,类型是 NotFoundException,设置一条异常信息,没找到用户。

再添加一个 pass,它的值是执行 await entity.comparePassword 返回的结果,把 password 交给这个方法,这个 password 的值是请求里的 password,也就是用户填写的他的当前的密码。

下面做一下判断,如果没有通过验证,我们就可以 throw 一个异常,类型是 BadRequestException,设置一条异常信息,密码验证失败,请重新输入正确的密码。

如果用户填写他的当前密码跟我们存储的密码匹配,可以让用户实体里的 password 属性的值等于 newPassword,就是用户要更新的密码。

最后 return 的是,执行 await,this.userRepository 上的 save ,把用户实体交给它。

路由

打开 UserController 控制器,在这个控制器里添加一条路由,支持的 Http 方法是 Put,所以要使用一个 @Put 装饰器,给它一个参数,:id/password,这样这个路由的地址就会是 users/用户 id 号/password。

添加一个 async 方法,名字叫 updatePassword ,方法需要一个 id 参数,这个参数用 @Param 装饰一下,需要的是 id 地址参数的值,参数的名字可以叫 id,类型是 string,再添加一个 data 参数,它要使用 @Body 装饰器装饰,名字是 data,类型是 UpdatePasswordDto。

在方法里面,return 的是 await 用一下 this.userService.updatePassword,把 id 还有 data 交给这个方法。

测试

打开 HTTP 客户端,配置一个请求,请求的方法设置成 PUT,地址是 users/ 用户的 id 号,斜线,再加上 password。

请求里带着一个 JSON 格式的数据 ,数据里面需要 password,它是用户提供的当前的密码,还需要一个 newPassword,它的值是用户要更新的密码。

发送一下请求,成功以后会得到的响应里面会包含 password,找到 User 控制器里的 updatePassword 方法,在它上面再添加一个 @UseInterceptors 使用一个拦截器,要用的是 ClassSerializerInterceptor。

回到 HTTP 客户端,再发送一下这个更新密码的请求,这回得到了一个 400 的响应,因为用户提供的密码跟我们存储的密码不匹配。

修改一下用户当前的密码,还有要更新的密码,发送一下这个请求,这回更新成功以后,没有返回用户的 password。

再到数据库客户端观察一下,注意 id 号是 x 的用户的 password 字段的值,刷新,你会发现这个 password 值会有变化。

更新用户密码《 Nest.js 应用框架:用户 》

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点