前言

一个很经典的业务需求,注册用户时需要判断用户的账号是否已经存在,登录的时候也需要判断用户是否存在,只不过一个需要存在时报错,另一个需要判断不存在时报错。

教程

官方文档: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数据库校验

评论

暂无评论数据

暂无评论数据

目录