【问题标题】:How to validate request excel data on NestJs?如何验证 NestJs 上的请求 excel 数据?
【发布时间】:2021-07-25 22:33:17
【问题描述】:

我正在尝试验证 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;
}

【问题讨论】:

    标签: node.js nestjs


    【解决方案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);
    

    【讨论】:

    • 这对年轻的艾尔卡彭有帮助吗?
    猜你喜欢
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2012-02-15
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多