用户登录

更新用户 接口需要检查用户提供的当前登录的密码,还有要更新的数据,这些动作可以在一个中间件里完成。 打开 user.middleware 这个文件,在文件的顶部先导入一个 lodash ,等会儿会用到它里面提供的一个方法。

然后找个地方去定义一个验证更新用户数据用的中间件,中间件的名字可以叫 validateUpdateUserData,在中间件里面先准备点数据。可以从请求主体里面,把 validate 还有 update 这两个东西解构出来,来自 request.body 。

这个 validate 里面应该包含一个 password 属性,对应的值是用户当前的登录密码,在 update 里面可以包含用户要更新的数据,比如用户名,或者用户密码。

下面再准备一下当前用户,把当前用户的 id 解构出来,来自 request 上的 user 属性。在接口上使用 authGuard 中间件验证用户的登录状态,验证成功就会在请求上添加 user 这个属性。

中间件的最后需要执行一下 next 继续下一步的处理。 在这个 next 的上面,可以去做一些检查工作,先添加一组 try,catch 区块。 在 catch 里面处理一下错误,执行 next,带着 error,注意这里我们在 next 的前面加上了 return,这样就不会继续执行下面的代码了。

在 try 里面,可以先检查一下用户在请求的主体里面是不是提供了当前的登录密码。 用 if 做一下判断,! 用 lodash 里的 has 方法,检查 validate 这个对象里有没有 password 属性,如果有,这个 has 就会返回 true,没有,它就会返回 false。 如果用户没有在 validate 里面提供 password 属性的值。 可以在应用里触发一个异常,return,执行 next 带着一个错误,错误信息是 PASSWORD_IS_REQUIRED。之前在应用里已经处理过这种错误了。

下面可以从数据仓库里调取当前用户相关的数据,声明一个 user,等于 await,用一下 userService 里的 getUserById ,给它提供一个用户的 id 作为它的参数。再添加一个选项参数,把 password 属性的值设置成 true,这样调取的用户数据里面会包含用户的 password 栏目的值。

有了用户数据以后,再去验证一下用户密码是否匹配。声明一个 matched ,等于 await ,用一下 bcrypt 上的 compare,对比一下 validate 里的 password 跟 user 里的 password 是不是匹配。

validate 里的 password 是用户在请求的时候提供的当前的登录密码, user 里的 password 是我们存储在数据仓库里的这个用户的密码,这个密码是经过 HASH 处理的,所以对比的时候要用 bcrypt 上的 compare 来完成。

如果不匹配,可以在应用里触发一个异常,return 执行 next 带着一个错误,错误信息是 PASSWORD_DOES_NOT_MATCH。

继续再检查一下用户要修改的用户名是不是已经被占用了,判断一下,如果 update 里面有 name ,说明用户要修改自己的用户名。 声明一个 user,等于 await ,执行一下 user.service 里的 getUserByName,把用户名交给这个方法,它可以把对应的用户数据从数据仓库里找出来。

判断一下,如果按用户名找到了这个用户,就说明这个用户名已经在应用里存在了。这种情况我们就可以再触发一个异常,错误信息是 USER_ALREADY_EXIST 。

下面还得再处理一下用户要更新的密码。

判断一下,如果 update 里面有 password 属性,说明用户要更新自己的密码,先声明一个 matched ,等于 await,用一下 bcrypt 上的 compare ,对比一下 update.password 跟 user 里的 password 是否匹配。如果匹配说明用户要修改的密码跟原来的密码是一样的。

这样情况可以触发一个异常,执行一下 next,带着一个错误,错误信息是 PASSWORD_IS_THE_SAME 。

在这里可以再 HASH 一下用户要修改的密码,直接设置一下 request.body.update 里的 password 属性的值,等于 await,用 bcrypt 上的 hash 这个方法处理一下 update 里的 password ,级别设置成 10。

这样在后面的接口处理器那里,就可以直接把用户要修改的密码存储到数据仓库里了。

下面还得再处理一下这个 PASSWORD_IS_THE_SAME 这个错误,打开 app.middleware,在应用默认的异常处理器里面,添加一种新的情况,如果错误信息是 PASSWORD_IS_THE_SAME,可以把响应的状态码设置成 400,响应的信息设置成 要修改的密码不能与原密码一样。

创建验证更新用户数据中间件《 Node.js 服务端应用开发:资源接口 》

统计

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

社会化网络

关于

微信订阅号

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