使用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
相关产品推荐
相关产品推荐

