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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:46:14