如何在NestJs中对上传的Excel请求数据做字段合规性校验
手动触发class-validator校验Excel转换后DTO的实现方案
你当前遇到的适配问题本质是:NestJS内置的ValidationPipe仅会在请求参数绑定的自动流程中触发校验,不会覆盖你手动解析Excel、转换为JSON对象的自定义处理环节,完全可以复用你已经写在StudentDTO上的所有装饰器规则,在服务层处理环节手动完成逐字段校验,不需要更换其他校验工具。
前置准备
你已经引入了class-validator的装饰器,还需要搭配class-transformer完成普通对象到类实例的转换,否则装饰器规则无法被识别:
- 安装依赖:
npm install class-validator class-transformer
服务层逻辑改造
把原来processFile方法里标记的校验位置替换为完整的转换+校验流程,核心改动点包括:
- 用
plainToInstance把XLSX转出的纯JS对象批量转换为StudentDTO类实例 - 用
validateOrReject逐行触发校验规则 - 校验失败时携带Excel实际行号抛出明确错误,方便定位问题
import { plainToInstance } from 'class-transformer'; import { validateOrReject } from 'class-validator'; import { BadRequestException } from '@nestjs/common'; processFile(file: Express.Multer.File): void { const workBook: XLSX.WorkBook = XLSX.read(file.buffer, { type: 'buffer', cellDates: true, cellNF: false, }); const sheetName = workBook?.SheetNames[0]; const sheet: XLSX.WorkSheet = workBook.Sheets[sheetName]; // 加raw:false 让单元格内容统一输出为字符串,减少类型隐式转换带来的校验报错 const rawJsonData = XLSX.utils.sheet_to_json(sheet, { dateNF: 'YYYY-MM-DD', raw: false, }); // 普通对象转DTO类实例,激活类上的校验装饰器规则 const studentInstances = plainToInstance(StudentDTO, rawJsonData); // 逐行执行校验,必须用for...of循环等待异步校验完成,不要用forEach包裹async逻辑 for (const [index, instance] of studentInstances.entries()) { try { await validateOrReject(instance, { stopAtFirstError: true, whitelist: true, // 自动过滤DTO未声明的多余字段 }); } catch (errors) { // 偏移量+2是因为:XLSX读取的第一条数据对应Excel第2行(第1行是表头) const excelRowNo = index + 2; const errDetail = errors.map(item => Object.values(item.constraints).join(';')); throw new BadRequestException( `Excel第${excelRowNo}行校验不通过:${errDetail.join(',')}` ); } } // 所有行校验通过后再执行后续业务逻辑 console.log('校验通过的Excel数据', studentInstances); }
DTO规则适配细节
调整现有StudentDTO的遗漏规则,避免校验失效:
- 给未加装饰器的
id字段补充明确规则:如果是必填数字就加@IsNumber(),如果是可选字段就加@IsOptional(),class-validator默认不会校验没有装饰器标注的字段 - 日期类字段可以搭配
@IsDateString()规则,配合你已经配置的dateNF格式化参数,就能直接校验日期格式是否合规 - 如果需要批量汇总所有行的校验错误、避免用户改一次传一次,可以把遍历过程中收集到的所有错误存在统一数组里,全部遍历完成后一次性返回所有行的错误详情
内容的提问来源于stack exchange,提问作者Young Al Capone
相关产品推荐
相关产品推荐

