使用Express与Multer上传PDF文件失败,请求排查问题原因
排查PDF文件上传失败问题
我查了大量资料还是没找到问题,代码看起来正常,但PDF文件就是传不上去。以下是相关配置、路由和前端代码,请帮忙排查:
配置
const multer = require("multer"); const pdfUpload = multer({ limits: 50000000, storage: multer.diskStorage({ destination: (req, file, cb) => { console.log(file); try { cb(null, "uploads/"); } catch (err) { console.log(err); } }, filename: (req, file, cb) => { cb(null, "sheharyarCV.pdf"); }, }), fileFilter: (req, file, cb) => { const isValid = file.mimetype === "application/pdf" ? true : false; const error = isValid ? null : new Error("Issue with mimetype"); cb(error, true); }, }); module.exports = pdfUpload;
路由
const express = require("express"); const pdfUpload = require("../middlewares/pdf-upload"); const updateAboutAndResumeHandler = require("../controllers/aboutAndResume-controller"); const router = express.Router(); router.patch("/", pdfUpload.single("resume"), updateAboutAndResumeHandler); module.exports = router;
React代码(使用FormData发送数据)
const formChangeHandler = async (data) => { try { const formData = new FormData(); formData.append("about", data.about); formData.append("resume", data.resume); const response = await fetch( `${import.meta.env.VITE_BACKEND_URL}/api/about&resume`, { method: "PATCH", body: formData, } ); const result = await response; console.log(result); } catch (err) { console.log(err); } console.log(data); closePanel(); };
排查关键点:
- 请求URL格式错误:前端URL中的
about&resume存在问题,&会被解析为查询参数分隔符,导致后端路由匹配失败,建议改为about-resume或about/resume这类合法路径。 - 确认上传文件类型:检查前端
data.resume是否为标准File对象,可通过console.log(data.resume)验证类型,若为字符串或其他类型则无法被Multer识别。 - 添加Multer错误处理:当前路由未处理Multer抛出的错误,需补充错误捕获中间件,比如:
router.patch("/", pdfUpload.single("resume"), updateAboutAndResumeHandler, (err, req, res, next) => { if (err instanceof multer.MulterError) { return res.status(400).json({ error: err.message }); } else if (err) { return res.status(400).json({ error: err.message }); } next(); }); - 确认uploads目录存在:Multer不会自动创建
uploads/目录,需手动创建或在代码中添加目录判断与创建逻辑,否则会因目录不存在报错。 - 检查请求头Content-Type:在浏览器开发者工具Network标签中,确认请求头是否包含
multipart/form-data及对应的boundary字段,FormData应自动生成该头,但需验证是否被其他逻辑覆盖。 - 查看后端日志:检查后端控制台是否打印了
destination中的file对象,若未打印说明请求未到达Multer处理环节,需排查路由匹配、请求方法是否正确。 - 检查控制器逻辑:确认
updateAboutAndResumeHandler中是否正确处理req.file对象,比如是否读取了req.file.path等属性,避免内部错误被静默吞掉。
内容的提问来源于stack exchange,提问作者Sheharyar Ali
相关产品推荐
相关产品推荐

