因为我不想在一般的查询里面返回用户的密码字段,所以在定义用户实体里的 password 字段的时候,把它的 select 选项设置成了 false,不过有时候我们可能需要用到用户的密码,比如用户请求登录的时候,我们需要验证用户提供的密码跟我们存储的密码是否匹配。
先在 Http 客户端,发送一个登录请求,提示了一个 500 的内部服务错误,可以再到运行项目的终端观察一下这个错误。
引起这个错误的原因就是登录需要验证用户的密码,但是查询出来的用户实体里面并没有包含密码字段。
回到项目,打开 AuthService,在这个服务里,login 方法是处理用户登录请求用的,它里面用到了一个 UserService 上的 findByName 查询出来指定名字的用户。
打开 UserService,找到 findByName,下面可以改进一下这个方法,让这个方法接收一个可选的 password 参数,值的类型是 boolean, 使用这个方法查询用户的时候,如果 password 参数的值是 true,可以在查询里包含用户的密码字段。
这个查询我们可以换成使用 queryBuilder ,添加一个 queryBuilder,await,this.userRepository,createQueryBuilder,别名是 user。
下面设置一下查询条件,queryBuilder,where,条件是 user.name 等于 :name,后面提供这个 name 的值,它的值应该就是给这个 findByName 方法提供的 name 参数的值 ..
然后判断一下,检查 password 参数的值,如果是 true,再用一下 queryBuilder,addSelect,特别设置一下要添加的字段,需要 user.password。
下面添加一个 entity,用一下 queryBuilder,getOne,最后让方法 return 查询出来的这个 User Entity。
然后回到 AuthService,使用 findByName 这个方法查询用户的时候,如果需要用户的密码,可以把它的第二个参数设置成 true。
测试
回到 Http 客户端,发送一下这个登录请求,这回用户就又可以成功登录了。