在服务中使用类验证器?



当我尝试在服务中使用它时,class-validate总是返回长度= 0。

服务
export class UserService extends BaseService<UserEntity> {
private validator
constructor (
@Inject('USER_RESPOSITORY')
private userRespository: typeof UserEntity
) {
super(userRespository)
this.validator = new Validator()
}
async create (user: CreateUserDto): Promise<UserEntity> {
const error = await this.validator.validate(user)
if (error.length > 0) {
throw Error('Invalid criterial!')
}
const hashedPassword = await bcrypt.hash(user.password, 10);
user.password = hashedPassword

const rs = await super.create(user)
return rs
}
}

控制器:

@Post()
async create (@Body() user) {
return this.userService.create(user)
}

dto:

export class CreateUserDto {
@IsEmail()
email: string
@Length(8)
password: string
@IsOptional()
isSuperAdmin: number
}

值输入:{"email"nhathanluu"password"nhathan12"}

class-validate.validate()返回空数组。当我在控制器

中进行验证时就没问题了

您正在接受一个普通JavaScript对象并对其进行验证。它不是CreateUserDto的一个实例。验证器不知道提供验证元数据的装饰器。它只是验证一个普通的JS对象。验证器将找不到任何通知它如何验证它的元数据。它会认为它是有效的。

async isValid(user: CreateUserDto): Promise<boolean> {
const validator = new Validator();
const errors = await validator.validate(user);
return errors.length === 0;
}
const isValid = await this.isValid({ email: 'john', password: 'test' });
// ==> returns true

在你的控制器的情况下,它是NestJS转换为CreateUserDto的一个实例,然后执行验证。

确保您正在处理CreateUserDto的实例。您可以使用class-transformer包来执行此操作,也可以在NestJS的验证管道上设置transform选项。这样它就会为你把它转换成这样一个实例。

@Body(new ValidationPipe({ transform: true })) user: CreateUserDto

如果您使用全局ValidationPipe,您也可以在那里设置转换选项,但当然这会影响所有端点。

最新更新