Multer的fileFilter配置导致request.file为undefined问题排查
Multer fileFilter导致request.file为undefined的原因分析
问题场景
想用Multer仅允许上传图片,配置fileFilter后出现request.file为undefined的问题:
- 上传图片时
file.mimetype显示为正确的image/jpeg - 请求头包含正确的
Content-Type: multipart/form-data; boundary=<calculated when request is sent> - 移除fileFilter配置后一切正常
- 修改fileFilter的条件判断逻辑后功能恢复,但不清楚原因
原代码
const multerStorage = multer.memoryStorage(); // 2) Creating a multer filter (to test if the uploaded file is really an image): const multerFilter = (request, file, cb) => { if (file.mimetype.startsWith("image")) cb(null, true); cb(new AppError(400, `The only accepted files are images, please select an image ${request.file} file tyep: ${file.mimetype}`), false); }; const upload = multer({ storage: multerStorage, fileFilter: multerFilter }); exports.updateMyPhoto = upload.single("photo");
修改后代码
const multerFilter = (request, file, cb) => { if (!file.mimetype.startsWith("image")) cb(new AppError(400, `The only accepted files are images, please select an image ${request.file} file tyep: ${file.mimetype}`), false); cb(null, true); };
原因解析
原代码的核心问题是回调函数cb被执行了两次:
当上传的是图片时,if条件成立,先调用cb(null, true)允许文件上传,但之后没有终止函数执行,紧接着又调用了cb(new AppError(...), false)拒绝上传。Multer会以最后一次调用cb的结果为准,所以最终文件被拒绝,导致request.file为undefined。
修改后的代码逻辑是:
- 仅当文件不是图片时,才调用错误回调拒绝上传
- 如果是图片,直接调用
cb(null, true)允许上传,没有后续冲突的回调调用,文件能正常被Multer处理,request.file也就会正确赋值。
内容的提问来源于stack exchange,提问作者Marya
相关产品推荐
相关产品推荐

