MEAN栈图片上传遇Multer报错:next is not a function
解决方案
1. 修复 post.controller.js 中的导出错误
你的create方法写法有误,逗号运算符导致exports.create仅被赋值为upload.single('imagePath'),后续的处理函数没有关联到中间件链中。修改为中间件数组形式:
const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './public/uploads'); }, filename: function (req, file, cb) { cb(null, file.originalname + '-' + Date.now() + '-' + getExtension(file)); }, }); const upload = multer({ storage: storage, limits: { fileSize: 1024 * 1024 * 5, }, }); const getExtension = (file) => { var res = ''; if (file.mimetype === 'image/jpeg') res = '.jpg'; if (file.mimetype === 'image/png') res = '.png'; return res; }; // 修复为中间件数组,将multer中间件和处理函数组合 exports.create = [ upload.single('imagePath'), async (req, res, next) => { try { console.log(req.file, req.body); const { title, date } = req.body; const imagePath = req.file.path; const post = new Posts({ title, date, imagePath, }); await post.save(); return res.status(200).json({ success: true, post, }); } catch (error) { return res.status(500).json({ success: false, message: 'Server Error', error: error.message, // 建议只返回错误信息,避免泄露敏感内容 }); } } ];
2. 修复 posts.route.js 中的路由调用
原路由中手动调用PostsController.create(req, res)时没有传递next参数,导致multer中间件无法调用next()。直接将create作为中间件传入路由:
const express = require('express'); const PostsController = require('../controllers/posts.controller'); const Auth = require('../auth/auth'); const route = express.Router(); // 直接传入中间件数组,express会自动传递req、res、next route.post('/create', Auth.authenticateJWT, PostsController.create); route.get('/', Auth.authenticateJWT, (req, res) => { PostsController.getAllPosts(req, res); }); route.get('/:id', Auth.authenticateJWT, (req, res) => { PostsController.getPost(req, res); }); module.exports = route;
问题根源解释
- 控制器中的逗号运算符错误:
(exports.create = upload.single('imagePath')), async (...) => {...}这种写法等价于exports.create = upload.single('imagePath'),后面的异步函数被丢弃,multer中间件执行后无法找到后续处理逻辑,且路由调用时未传递next,导致multer尝试调用next(err)时触发TypeError。 - 路由手动调用控制器方法时未传递
next参数,不符合express中间件的调用规范。
内容的提问来源于stack exchange,提问作者Comet
相关产品推荐
相关产品推荐

