更新用户的时候要检查这个用户是否存在,并且还得验证用户提供的密码是否跟我们存储的密码相匹配。
打开 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 这个地址。