我正在尝试从 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;
}
答案 0 :(得分:1)
我通过使用 class-transformer
和 class-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);