因为应用不能包含同名的用户,所以在注册用户的时候,可以检查一下用户要注册的用户名是不是不存在,如果不存在就通过验证,如果已经存在了,可以做出一个异常响应,提示用户要注册的用户名已经存在了。
在终端,执行 nest generate provider 生成一个 provider ,名字是 user-not-exist.validator ,放在 user/validators 目录里面。
自定义验证器
回到项目,打开刚才生成的这个 UserNotExistValidator,自定义的 class-validator 验证器,需要用 @ValidatorConstraint 装饰一下,提供一个选项参数,把 async 设置成 true。
验证器类要实施一下 ValidatorConstraintInterface,这样就需要在这个类里面添加一个 validate 方法,方法第一个参数是被验证的值,名字可以是 value,类型设置成 string,第二个参数是一些参数,名字是 args,类型是 ValidationArguments。
在这个方法里面,可以检查 value 这个参数的值是否符合我们的要求,如果符合要求就让方法返回 true,不然就返回 false,暂时先让它返回 false。
在验证器里可以再添加一个 defaultMessage 方法,它返回的东西就是在验证出问题的时候默认的错误信息。这个方法也有一个 args 参数,参数是 ValidationArguments 。return 一个用户已存在。
使用自定义验证器
使用这个验证器可以这样,打开 CreateUserDto,在这个 name 属性的上面,用一个 @Validate 装饰器,然后指定一个验证器,比如 UserNotExistValidator。
测试
在 Http 客户端测试一下,发送一下这个创建用户请求,在错误信息这里会显示用户已存在,因为执行 UserNotExistValidator 这个验证器里的 validate 这个方法,它会一直返回 false,表示数据没有通过验证,没有设置错误信息就会使用默认的错误信息,也就是 defaultMessage 方法返回的值。