Nestjs使用class-validator实现数据库字段校验,是否存在
前言
一个很经典的业务需求,注册用户时需要判断用户的账号是否已经存在,登录的时候也需要判断用户是否存在,只不过一个需要存在时报错,另一个需要判断不存在时报错。
教程
官方文档:class-validator
创建文件:IsFieldExist.ts
import { registerDecorator, ValidationOptions, ValidationArguments } from "class-validator";
import { PrismaClient } from "@prisma/client";
let prisma: PrismaClient | null = null;
export type IsFieldExistOptions = {
/** 允许存在 */
allowExist: boolean;
};
export function IsFieldExist(tableName: string, options: IsFieldExistOptions, validationOptions?: ValidationOptions) {
return function (object: any, propertyName: string) {
registerDecorator({
name: "IsFieldExist",
target: object.constructor,
propertyName: propertyName,
constraints: [tableName, options],
options: validationOptions,
validator: {
async validate(value: any, args: ValidationArguments) {
if (!prisma) prisma = new PrismaClient();
const fieldName = args.property;
const { allowExist } = options;
const findResult = await prisma[tableName].findFirst({
where: {
[fieldName]: value
}
});
if (allowExist) {
// 允许存在
return Boolean(findResult);
} else {
// 不允许存在
return !findResult;
}
}
}
});
};
}
使用
import { IsEmail, Length, IsNotEmpty } from "class-validator";
import { IsFieldExist } from "../utils/class-validator-extends/IsFieldExist";
/** 注册dto */
export class RegisterDto {
/** 邮箱 */
@IsNotEmpty({ message: "邮箱不能为空" })
@IsEmail({}, { message: "邮箱格式不正确" })
@IsFieldExist("user", { allowExist: false }, { message: "该邮箱已被注册" })
email: string;
/** 密码 */
@IsNotEmpty({ message: "密码不能为空" })
@Length(6, 20, { message: "密码长度为6-20位" })
password: string;
/** 确认密码 */
@IsNotEmpty({ message: "确认密码不能为空" })
confirmPassword: string;
}
@IsFieldExist("user", { allowExist: false }, { message: "该邮箱已被注册" })
通过allowExist
配置项来控制是否允许通过,以实现更好的通用性。
分类:
Nest.js
标签:
异步Nestjsclass-validator数据库校验
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据