Node.js使用multer上传图片时req.body为空、存储路径异常等问题咨询
Node.js Multer图片上传问题排查与解决方案
你遇到的所有问题本质都是同时挂载了express-busboy和multer两个multipart/form-data类型请求解析中间件,二者功能冲突导致的,具体问题原因和解决方案如下:
单个问题原因说明
- 问题1:
/products接口req.body为空
全局挂载的express-busboy会优先消费multipart/form-data类型的请求流,提前完成解析。当请求进入/products接口的multer中间件时,请求流已经被读取完毕,multer无法正常解析出普通表单字段,只会读取到express-busboy挂载到req上的文件对象,所以req.body为空。而/test接口没有multer中间件干扰,express-busboy的解析结果正常生效,所以req.body可用。 - 问题2:
upload.single()返回req.files而非req.file
你拿到的req.files不是multer生成的,是全局挂载的express-busboy解析后挂载到请求对象上的。由于请求流提前被消费,multer的upload.single逻辑没有正常执行,自然不会生成预期的req.file对象。express-busboy不管单文件还是多文件,默认都会把所有文件放在req.files集合下,所以你会看到里面只有一个文件的情况。 - 问题3:文件存入UUID命名文件夹、添加
allowedPath后无法存储
这个是express-busboy的默认行为,它默认开启了autoPath配置,会自动为每个上传任务生成UUID命名的子目录来存储文件,避免重名冲突。你添加的allowedPath正则本身存在语法错误,且匹配规则是/upload,和你配置的存储路径uploads/完全不匹配,相当于拦截了所有合法上传请求,所以文件不会被存储。
解决方案
推荐直接删除express-busboy相关配置,仅使用multer处理文件上传,避免冲突,配置步骤如下:
- 删掉
server.js中如下两行代码:
const expressBusboy = require('express-busboy'); expressBusboy.extend(app,{upload : true , path : 'uploads/'});
- 配置multer的磁盘存储规则,指定存储路径和文件名:
const multer = require('multer') // 配置磁盘存储 const storage = multer.diskStorage({ // 存储路径,直接指定到预先创建的uploads文件夹 destination: function (req, file, cb) { cb(null, 'uploads/') }, // 自定义文件名避免重名 filename: function (req, file, cb) { const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) const ext = file.originalname.split('.').pop() cb(null, `${file.fieldname}-${uniqueSuffix}.${ext}`) } }) const upload = multer({ storage: storage })
- 原有路由逻辑无需改动,配置后可实现预期效果:
/products接口可正常获取req.body表单字段和multer生成的req.file单文件对象- 上传文件会直接存储在
uploads文件夹下,不会自动生成UUID子目录
如果要保留express-busboy使用,需完全删除multer相关配置,修改express-busboy配置关闭自动生成子目录即可:
expressBusboy.extend(app,{ upload : true, path : 'uploads/', // 关闭自动生成UUID子目录 autoPath: false });
内容的提问来源于stack exchange,提问作者mehraeen mozhdi
相关产品推荐
相关产品推荐

