NestJS自定义输入验证:DTO条件校验实现方法
条件验证实现方案:当value1为"toy"时value2不能为空
针对你定义的TypeScript DTO,这里提供两种实用的实现方式:
方式一:使用class-validator库(TypeScript常用验证方案)
这是Node.js/TypeScript项目里做DTO验证的主流方式,步骤如下:
- 先安装依赖:
npm install class-validator class-transformer
- 修改DTO,通过
@ValidateIf结合@IsNotEmpty实现条件验证:
import { IsNotEmpty, ValidateIf } from 'class-validator'; export class InputDTO { value1: string; // 只有当value1等于"toy"时,才触发value2的非空验证 @ValidateIf((obj) => obj.value1 === 'toy') @IsNotEmpty({ message: '当value1为"toy"时,value2不能为空' }) value2: string; }
- 在业务代码中调用验证:
import { validate } from 'class-validator'; async function checkInputValidity(input: InputDTO) { const validationErrors = await validate(input); if (validationErrors.length > 0) { // 提取错误信息并处理,比如抛出异常或返回给前端 const errorMessages = validationErrors.map(err => Object.values(err.constraints)).join(', '); throw new Error(errorMessages); } }
方式二:手动编写验证逻辑(无需第三方库)
如果不想引入额外依赖,可以直接在DTO里写验证方法:
export class InputDTO { value1: string; value2: string; // 自定义验证方法 validate(): string[] { const errors: string[] = []; // 判断value1为"toy"且value2为空(含纯空格的情况) if (this.value1 === 'toy' && (!this.value2 || this.value2.trim() === '')) { errors.push('当value1为"toy"时,value2不能为空'); } return errors; } } // 使用示例 const testInput = new InputDTO(); testInput.value1 = 'toy'; testInput.value2 = ' '; // 空字符串或纯空格都会触发错误 const errors = testInput.validate(); if (errors.length > 0) { console.error('验证失败:', errors.join('')); }
内容的提问来源于stack exchange,提问作者Tony Mathew
相关产品推荐
相关产品推荐

