You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:06:06