当我尝试在服务中使用它时,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
,您也可以在那里设置转换选项,但当然这会影响所有端点。