使用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
相关产品推荐
相关产品推荐

