You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用class-validator禁止同一课程出现在添加/移除数组中

如何避免同一课程同时出现在添加和移除列表中?

我正在开发一个大学课程管理项目,负责处理学生选课的添加与删除操作。目前遇到一个问题:学生可能会将同一门课程同时填入“添加”列表和“移除”列表,请问该如何避免这种情况?

我的初始验证Schema代码如下:

import { IsOptional, IsArray } from "class-validator";

class courseValidate {
    @IsOptional()
    @IsArray()
    addCourses!: string[]


    @IsOptional()
    @IsArray()
    removeCourses!: string[]
}

我尝试过多种自定义装饰器,但均未生效。


我的尝试与解决方案

之后我编写了自定义验证约束,一开始没生效,最后发现是个低级逻辑错误:checkCollision方法的返回值写反了。

修正后的完整代码如下:

import {
  IsArray,
  IsNotEmpty,
  IsOptional,
  IsUUID,
  MaxLength,
  MinLength, Validate,
  ValidationArguments,
  ValidatorConstraint,
  ValidatorConstraintInterface
} from "class-validator";
import { get, intersection, map, trim } from "lodash";

@ValidatorConstraint({name: "uniqueArrays", async: false})
export class UniqueArraysValidation implements ValidatorConstraintInterface {
  validate(value: undefined, args: ValidationArguments): boolean {
    let isValid = true
    const remove = map(get(args, 'object.removeCourses', []), e => trim(e));
    const add = map(get(args, 'object.addCourses', []), e => trim(e));
    if(args !== undefined && remove.length && add.length) {
      isValid = this.checkCollision(remove, add)
    }
    return isValid
  }

  checkCollision(list1: string[], list2: string[]): boolean {
    const commonItems = intersection(list1, list2);
    // 原错误:返回commonItems.length > 0,逻辑完全相反
    return commonItems.length === 0;
  }

  defaultMessage(args: ValidationArguments) {
    return `同一课程不能同时出现在添加和移除列表中`;
  }
}

class courseValidate {
    @IsOptional()
    @IsArray()
    addCourses!: string[]


    @IsOptional()
    @IsArray()
    removeCourses!: string[]

    @Validate(UniqueArraysValidation)
    readonly uniqueArrays!: string[];
}

错误原因说明

原来的问题出在checkCollision方法的逻辑上:我之前错误地返回commonItems.length > 0,这意味着当两个列表存在重复课程时验证反而通过,完全搞反了预期逻辑。修正为commonItems.length === 0后,只要两个列表有交集(同一课程同时存在),验证就会失败,并返回对应的错误提示。

内容的提问来源于stack exchange,提问作者John Wayn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:07:35