用户登录

更新用户的时候要检查这个用户是否存在,并且还得验证用户提供的密码是否跟我们存储的密码相匹配。

打开 UpdateUserCommand 命令的处理器,在文件顶部导入 bcrypt 里面提供的所有东西,起个名字叫 bcrypt,来自 bcrypt 这个包,验证用户密码的时候会用到它提供的功能。

然后在这个处理器的构造方法里,注入一个 Repository ,实体类型是 UserEntity,名字是 userRepository,分别再导入需要用的这些东西。

这个 UserEntity 属于 UserModule 模块,所以在这个命令处理器所属的模块里要导入 UserModule,添加一个 imports,用一个 forwardRef,返回一个 UserModule 模块。

再回到命令处理器,在 execute 方法里面,准备一下需要的数据,解构一下命令参数,需要 userId,validate 还有 update,它们都来自 command.params 。

然后可以创建一个用户查询构建器,声明一个 userQueryBuilder,等于 this.userRepository,createQueryBuilder ,别名是 user,下面可以再用 select 选择几个需要的字段,需要 user.id AS id,还需要 user.name,AS name,再添加一个 user.password,AS password。

下面可以查询出要更新的这个用户,声明一个 user,等于 await 用一下 userQueryBuilder ,用 where 设置条件,user.id 等于 :userId,后面设置一下这个 userId 参数的值,它的值就是从命令参数里解构出来的 userId。然后调用 getRawOne 这个方法得到查询的数据。

判断一下,如果 !user,也就是如果没有找到要更新的这个用户,可以 throw 一个 NotFoundException,异常信息是没找到要更新的用户。

下面可以检查一下用户提供的密码是否匹配,声明一个 isPasswordMatches ,等于 await,用一下 bcrypt.compare,第一个参数是 validate.password,它的值是用户在客户端那里提供的密码,第二个参数是 user.password ,它的值是存储在数据仓库里的用户密码。

然后判断一下 !isPasswordMatches ,如果密码不匹配,可以 throw 一个异常,异常信息是密码不对。

测试

在 Http 客户端,测试一下,修改一下更新用户请求主体里面的 validate 里面的 password 属性的值,改成一个错误的密码。发送一下这个请求,提示密码不对。

我们应用的更新用户接口会根据请求里带的令牌,判断要更新的用户是谁,然后会检查用户是否存在,并且会验证密码是否匹配,如果不匹配就会给出一个异常响应。

再修改一下这个密码,改成一个正确的密码,重新发送一下请求,用户存在并且密码匹配,得到的就是这个正常的响应。

现在这个更新用户接口支持一个 userId 地址参数,这个参数实际上用不到,因为我们的应用会根据请求里的令牌来判断要更新的用户是谁。

打开 user-update.controller,把更新用户接口的这个 userId 参数删除掉。

再回到 Http 客户端,现在请求更新用户接口,可以把这个地址里的 userId 参数值删除掉。也就是可以直接用 PATCH 方法请求 users 这个地址。

更新用户时检查用户与密码《 Nest.js 企业级后端实践:用户帐户 》

统计

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

社会化网络

关于

微信订阅号

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