NestJS文件上传验证:文件字段为空或不存在的校验问题
问题
需要验证用户是否正确将文件发送到指定字段:控制器需校验multipart form data中是否存在file字段,且该字段关联真实文件并已发送。
现有代码如下:
@UseInterceptors(FileInterceptor('file')) @Post('file/pass-validation') uploadFileAndPassValidation( @UploadedFile( /*new ParseFilePipeBuilder() .addFileTypeValidator({ fileType: 'jpeg', }) .build({errorHttpStatusCode: 400}),*/ ) file: Express.Multer.File, ) { console.log(file) return true; }
当前遇到的问题:
- 空表单请求时,控制台输出
undefined,但期望返回400 Bad Request - 启用注释中的
ParseFilePipe后,出现500内部服务器错误,原因是管道尝试对undefined的文件变量执行操作
解决方案
核心问题是没给ParseFilePipe添加必填验证规则,导致当file字段不存在时,管道拿到的是undefined,进而触发内部错误。只需要在ParseFilePipeBuilder链中加入addRequiredValidator()即可解决。
修改后的完整代码:
import { HttpStatus, UseInterceptors, Post, UploadedFile } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { ParseFilePipeBuilder } from '@nestjs/common'; @UseInterceptors(FileInterceptor('file')) @Post('file/pass-validation') uploadFileAndPassValidation( @UploadedFile( new ParseFilePipeBuilder() .addRequiredValidator() // 强制校验file字段存在且为有效文件 .addFileTypeValidator({ fileType: 'jpeg', }) .build({errorHttpStatusCode: HttpStatus.BAD_REQUEST}), ) file: Express.Multer.File, ) { console.log(file); return true; }
关键细节
addRequiredValidator():会自动校验multipart form data中是否存在file字段,且该字段对应的是真实上传的文件(不是空的表单字段)。验证失败时直接返回400状态码,不会出现500错误。- 用
HttpStatus.BAD_REQUEST替代硬编码的400,代码更规范且可读性更高。 - 现在空表单请求、未上传文件或者上传非jpeg文件时,都会返回符合预期的400 Bad Request响应。
内容的提问来源于stack exchange,提问作者Bernard
相关产品推荐
相关产品推荐

