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

Express设置表单enctype为multipart/form-data时req.body返回空对象排查

问题结论

该问题与EJS模板引擎完全无关,模板引擎仅负责前端页面渲染,只要表单的enctype、字段name属性配置正确,不会影响后端请求解析逻辑。你之前使用Pug、Handlebars开发未出现问题,是因为当时的multer调用逻辑没有错误。

问题原因

Express内置的express.urlencoded、express.json中间件仅支持解析application/x-www-form-urlencoded、application/json类型的请求体,multipart/form-data类型的请求体必须由multer这类专门的中间件解析。只要multer配置、调用正确,解析完成后会自动将普通表单字段挂载到req.body,上传文件挂载到req.file。

你当前的代码存在三个直接导致问题的错误:

  • multer配置项拼写错误:configMulter对象的键名错误写为sotrage,正确应为storage
  • upload方法参数顺序传反:multer生成的上传中间件参数顺序为(req, res, callback),你的代码写为upload(res, req, function(error)),将req、res对象颠倒,导致multer无法读取请求内容完成解析
  • 错误判断变量名错误:回调内判断的变量名是errores,但传入的参数名为error,变量未定义会导致逻辑异常

修正后的代码

const multer = require('multer');
const Grupos = mongoose.model('Grupos');
const shortid = require('shortid');
const configMulter = {
    // 修正拼写错误
    storage: multer.diskStorage({
        destination: (req, file, next) => {
            next(null, __dirname+'\\..\\public\\uploads\\grupos');
        },
        filename: (req, file, next) => {
            const extension = file.mimetype.split('/')[1];
            next(null, `${shortid.generate()}.${extension}`);
        }
    })
}

const upload = multer(configMulter).single('imagen');

exports.subirImagen = (req, res, next) => {
    // 修正参数顺序
    upload(req, res, function(error) {
        // 修正变量名
        if(error){
            console.log(error);
            return res.status(500).send('文件上传失败');
        }
        next();
    })
}

额外注意事项

确保前端表单内文件上传框的name属性值和multer(config).single('imagen')的参数完全一致,普通表单字段需要放在同一个form标签内,即可在后续业务逻辑中正常读取req.body的普通字段和req.file的文件信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:30:04