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

使用multer与sharp处理图片时,导出多个module.exports出现TypeError: fileUpload.single is not a function的问题求助

解决 TypeError: fileUpload.single is not a function 问题

这个错误其实是导出和引用不匹配导致的小坑——你之前直接导出multer实例时没问题,但改成导出包含多个中间件的对象后,路由里的引用逻辑就需要调整了。

问题根源

你现在从中间件文件导出的是一个包含两个属性的对象:

module.exports = { fileUpload: fileUpload, resizeUserPhoto: resizeUserPhoto };

而路由里的const fileUpload = require("../middleware/file-upload");拿到的就是这个对象,对象本身并没有single方法——真正的single方法属于对象里的fileUpload属性(也就是你原来配置的multer实例)。

两种解决办法

办法1:在路由里解构出正确的中间件

修改路由代码,从导出的对象里直接提取需要的两个中间件,这样就能正确调用multer的single方法了:

const express = require("express");
const userController = require("../controllers/userController");
// 解构导出对象里的两个中间件
const { fileUpload, resizeUserPhoto } = require("../middleware/file-upload");

router.post(
  "/update-avatar",
  fileUpload.single("image"),
  resizeUserPhoto, // 别忘了加上图片处理的中间件,不然图片不会被保存到磁盘
  userController.updateAvatar
);

办法2:调整中间件的导出方式

如果你想保持路由里的引用习惯不变,可以修改中间件的导出逻辑,把multer实例作为默认导出,同时额外挂载图片处理中间件:

// 中间件文件里修改导出部分
module.exports = fileUpload;
module.exports.resizeUserPhoto = resizeUserPhoto;

然后路由里可以这样使用:

const express = require("express");
const userController = require("../controllers/userController");
const fileUpload = require("../middleware/file-upload");
const resizeUserPhoto = fileUpload.resizeUserPhoto;

router.post(
  "/update-avatar",
  fileUpload.single("image"),
  resizeUserPhoto,
  userController.updateAvatar
);

额外优化提醒

你的resizeUserPhoto中间件里,sharp的toFile是异步操作,直接调用后就执行next()可能会导致图片还没保存完成就进入下一个中间件。建议改成异步/await的方式,确保文件写入完成后再继续:

const resizeUserPhoto = async (req, res, next) => {
  if (!req.file) return next();
  req.file.filename = `hero-${Date.now()}.jpeg`; // 记得加上文件后缀
  await sharp(req.file.buffer)
    .resize(400, 400, { fit: sharp.fit.outside })
    .toFormat("jpeg")
    .jpeg({ quality: 80 })
    .toFile(`uploads/images/${req.file.filename}`);
  next();
};

内容的提问来源于stack exchange,提问作者Waterfall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:02:42