如何在 NestJs 上验证请求 excel 数据?

时间:2021-05-03 13:56:08

标签: node.js nestjs

我正在尝试从 excel 文件(从正文请求传递的文件)中验证数据类型和约束,但我做不到!。我正在阅读有关类验证器的信息,但我认为它对我不起作用,因为我没有收到 json 数据,只是从请求正文作为文件传递的 excel 文件。我编写了一个服务,在其中放置了读取整个文件的逻辑并添加到数组中(作为我的数据 dto)。有什么方法可以验证此时的每个字段并在检测到问题时返回?谢谢:)

文件控制器:

@Controller('file-parser')
export class FileParserController {
  constructor(private readonly fileParserService: FileParserService) {}

  @Post('upload')
  @UseInterceptors(FileInterceptor('file'))
  UploadExcelFile(@UploadedFile() file: Express.Multer.File) {
    return this.fileParserService.processFile(file);
  }
}

文件服务:

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]; // asigne first sheet name of file
    const sheet: XLSX.WorkSheet = workBook.Sheets[sheetName]; // entire sheet information asigned to sheet variable
    
    const jsonData: StudentDTO[] = XLSX.utils.sheet_to_json(sheet, {
      dateNF: 'YYYY-MM-DD',
    });
    // Add fields validation here
    console.log(jsonData);
  }

学生 DTO:

import { IsNotEmpty, IsNumber, IsOptional, IsString, MaxLength } from 'class-validator';
export class StudentDTO {
  id: number;
  @IsString()
  @IsNotEmpty()
  @MaxLength(25)
  studentCode: string;
  @IsString()
  @IsNotEmpty()
  @MaxLength(50)
  studentName: string;
  @IsString()
  @IsNotEmpty()
  @MaxLength(50)
  studentLastname: string;
}

1 个答案:

答案 0 :(得分:1)

我通过使用 class-transformerclass-validator 的组合解决了类似的问题。获得原始 jsonData 后,我先调用了 class-transformer.plainToClass(),然后调用了 class-validator.validate()。以下是您大致需要的:

const students: StudentDTO[] = plainToClass(
   StudentDTO[],
   jsonData,
   { excludeExtraneousValues: false},
);

const validatorOptions: ValidatorOptions = {
   whitelist: true, // strips all properties that don't have any decorators
   skipMissingProperties: false,
   forbidUnknownValues: true,
   validationError: {
      target: false,
      value: false,
   },
};
const errors = await validate(students, validatorOptions);