【发布时间】:2020-02-05 23:50:16
【问题描述】:
我正在尝试为 Typestack 类验证器创建一个新的约束。 “IsUnique” 约束将实体作为类型,并将其列作为参数来检查该列是否在数据库中不存在并且是唯一的。
我尝试了下面的代码,但不知何故,我无法通过 registerDecorator 中的验证器键将类型传递给 "IsUniqueConstraint"。因为,我是 Typescript 的新手,所以我不太了解它的概念。
有人可以帮我知道我们该怎么做吗?
is-unique.constraint.ts
import { registerDecorator, ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments, ValidationOptions } from 'class-validator';
import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
@ValidatorConstraint({ name: 'isUnique', async: true })
@Injectable()
export class IsUniqueConstraint<T> implements ValidatorConstraintInterface {
constructor(private readonly repository: Repository<T>) { }
async validate(value: string, args: ValidationArguments) {
const [column] = args.constraints;
const result = await this.repository.findOne({ where: { [column]: value } });
if (result) {
return false;
}
return true;
}
defaultMessage(args: ValidationArguments) {
return `"${args.value}" already exists for ${args.constraints[0]}`;
}
}
export function IsUnique<T>(column: string, validationOptions?: ValidationOptions) {
return (object: object, propertyName: string) => {
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
constraints: [column],
validator: IsUniqueConstraint,
});
};
}
user.dto.ts
import { IsNotEmpty } from 'class-validator';
import { IsUnique } from './../shared/constraints/is-unique.constraint';
import { User } from './user.entity';
export class CreateUserDto {
@IsNotEmpty()
@IsUnique<User>('username')
readonly username: string;
}
【问题讨论】:
标签: javascript typescript generics decorator class-validator