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

Express中含图片的POST表单数据无法在控制台打印的问题

解决Express后端无法接收带图片的表单数据问题

问题原因

你的代码核心问题是**express-fileupload中间件加载顺序错误**——它被放在了路由注册之后。Express中间件按注册顺序执行,当请求到达/admin/add-product路由时,文件上传中间件还未生效,无法解析multipart/form-data格式的表单,导致req.body为空。

另外,带文件的表单中,普通输入字段存放在req.body,图片文件数据存放在req.files中,需要分别读取才能获取完整表单内容。

修复步骤

1. 调整中间件顺序(修改app.js)

将app.use(fileUpload())移到路由注册之前,确保请求先经过文件上传中间件处理:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var hbs = require('express-handlebars')
var usersRouter = require('./routes/users');
var adminRouter = require('./routes/admin');
var fileUpload = require('express-fileupload')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.engine('hbs', hbs.engine({ extname: 'hbs', defaultLayout: 'layout', layoutsDir: __dirname + '/views/layout/', partialsDir: __dirname + '/views/partials/' }))

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// 把fileUpload中间件移到路由注册之前
app.use(fileUpload())
app.use('/', usersRouter);
app.use('/admin', adminRouter);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

2. 修改路由处理逻辑(修改admin路由文件)

在POST接口中同时打印req.body(普通表单字段)和req.files(图片文件数据):

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
  let products=[{
    name:"Iphone 15",category:"Mobile",discription:"flaghship phone by apple",image:"https://encrypted-tbn1.gstatic.com/shopping?q=tbn:ANd9GcR199XXubeTzwSceNjVSDZLSmAS9XKBkftsUbcSGADAGYXqqDRs17BYcd3jocTU_xeenejYWbzJbs394WBFqKBZOwJJcI3il9Pmcz8d3bA&usqp=CAE"
  },{
    name:"Samsung Galaxy S23 ultra",category:"Mobile",discription:"flaghship phone by Samsung",image:"https://encrypted-tbn0.gstatic.com/shopping?q=tbn:ANd9GcQ3uCOtqrOC3OSc1mveQKwrFN4bBVPsOk5FhSznuH-9bZMOU4qHs_-FYJscJ8nFGLDDZ3a_Cla-HCiHjkik3CaBRgsarJ-ZDKErAyLMLe2VRNBIeU1sti7Q&usqp=CAE"
  },{
    name:"Nothing phone 2",category:"Mobile",discription:"flaghship phone by NOthing",image:"https://encrypted-tbn0.gstatic.com/shopping?q=tbn:ANd9GcQvcN7cV_G4iXn6uy8_RoByjPj35Vh1MA0nDKFdg6YNep0EzLTbTsV40YqO1tKxxjFQl8DFOfDW1-vOFTEikA_ZdlrWh9WDwHeFIln0xDuuy2BQRp2wcl4ZTw&usqp=CAE"
  },{
    name:"MI 13 ultra",category:"Mobile",discription:"flaghship phone by apple",image:"https://encrypted-tbn0.gstatic.com/shopping?q=tbn:ANd9GcTv3moXySHfJ_y7ZuoC7S2gxrA2wWtvOe9Zw-YQiwX59uIBkR4IlZuptO9ThOnFiUGLSwpQjcOI8m0LCY19RMWJBcEn66jj_TioDlxIKCJgIekD60awjBYLIg&usqp=CAE"
  }]
  res.render('admin/view-products',{admin:true,products})
});
router.get('/add-product',function(req,res){
  res.render('admin/add-product')
})
router.post('/add-product',(req,res)=>{
  // 打印完整表单数据
  console.log('普通表单字段:', req.body);
  console.log('图片文件数据:', req.files);
  res.send('表单数据已接收');
})
module.exports = router;

验证效果

重启Express服务后提交表单,控制台会输出类似以下内容:

普通表单字段: { Name: '测试产品', Category: '数码', Price: '999', Discription: '测试描述' }
图片文件数据: { Image: { name: 'test.jpg', data: <Buffer ...>, size: 12345, encoding: '7bit', tempFilePath: '', truncated: false, mimetype: 'image/jpeg', md5: 'xxx', mv: [Function: mv] } }

内容的提问来源于stack exchange,提问作者Abay sankar s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:01:03