在 UserNotExistValidator 这个验证器里可以执行一个查询,检查要注册的用户是否不存在。先创建一个查询,在终端,执行 npm run gq 生成一个查询,名字是 user-exist ,放在 user/queries 目录里面。
打开创建的 UserExistQuery 查询,在它的参数里面,添加一个 name 属性,类型是 string 。然后打开这个查询的处理器,在它的构造方法里面,先注入一个 Repository。
对应的实体是 UserEntity,名字是 userRepository,然后再分别导入需要的这些东西。
在 execute 方法里面,解构一下查询参数,把 name 解构出来,来自 query.params ,下面声明一个 result,等于 await,执行 this.userRepository.find,提供一个对象,用 where 设置一个条件,name 应该等于 name。可以再用 select 选择需要的字段,一个数组,里面添加一个 'id' 。
最后 return 的值,可以判断一下 result.length 是否大于 0,如果大于 0 ,说明用户存在,不大于 0 ,说明用户不存在。
验证器
打开 UserNotExistValidator,在这个验证器里面先注入 QueryBus,添加一个构造方法,然后注入需要的 QueryBus。
用 async 标记一下 validate 方法,然后在这个方法里,声明一个 result,等于 await ,执行一个查询,新建一个 UserExistQuery 查询,提供一个对象,设置一下 name,值是 value。最后让方法返回 !result ,这样如果用户存在,验证就不通过,用户不存在,验证就通过。
在 Http 客户端,发送一下创建用户请求,这回得到了一个状态码是 500 的响应,说明应用出了点问题,观察一下控制台,这里报了一个错,原因是在验证器里,现在无法获取到注入的依赖。下面我们需要再配置一下。
main.ts
打开 main.ts ,在这里要用一下 class-validator 这个包里提供的 useContainer ,注意千万不要导错了,因为 typeorm 里面也提供了一个 useContainer。这个小错误我用了两个小时才解决。
给这个 useContainer 提供一个 app.select,选择 AppModule ,再提供一个选项参数,把 fallbackOnErrors设置成 true。
测试
在 Http 客户端再测试一下,发送一下这个创建用户请求,这回控制台就不再报错了。
在响应里提示用户已存在,因为现在应用的 user 数据表里包含了名字是张三的这个用户。修改一下要注册的用户名,比如李四,再发送一下这个请求,这次就不再提示用户已存在这个错误信息了。
现在密码字段没有通过验证,改一下密码的值,重新发送一下这个创建用户请求,成功创建了用户以后,得到的响应里面会包含新创建的这个用户的 id。
在数据库客户端观察一下,刷新一下应用界面,在 user 表里,现在会包含李四这个用户。为了以后方便测试,这里我们复制一下这个 hash 之后的密码,用它替换一下之前没 hash 的用户的密码,command + s 保存一下修改。