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

Express接口接收form-data时req.body为undefined问题求助

解决Express API无法解析form-data请求导致req.body为undefined的问题

先来看你的server.js代码:

const fs = require("fs");
const express = require("express");
const bodyParser = require("body-parser");
const mysql = require("mysql");
const app = express();
const port = process.env.PORT || 5000;
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
const data = fs.readFileSync("./database.json");
const conf = JSON.parse(data);
const connection = mysql.createConnection({
  host: conf.host,
  user: conf.user,
  password: conf.password,
  port: conf.port,
  database: conf.database
});
connection.connect();
app.get("/api/users", (req, res) => {
  connection.query(
    "select * from users where isDeleted = 0",
    (err, rows, fields) => {
      res.send(rows);
      // console.log(err);
      // console.log(rows);
    }
  );
});
app.post("/api/users", (req, res) => {
  let sql = "insert into users values (null,?,?,now(),now(),0)";
  let name = req.body.name;
  let dsc = req.body.dsc;
  let params = [name, dsc];
  console.log(params);
  connection.query(sql, params, (err, rows, fields) => {
    res.send(rows);
    // console.log(err);
    // console.log(rows);
  });
});
app.delete("/api/users/:id", (req, res) => {
  let sql = "update users set isDeleted = 1 where id = ?";
  let params =[req.params.id];
  connection.query(sql,params, (err, rows, fields)=>{
    res.send(rows);
    // console.log(err);
    // console.log(rows);
  });
});
app.listen(port, () => console.log(`Listening on port http://localhost:${port}`));

问题原因

你当前只配置了body-parser来解析application/x-www-form-urlencoded和application/json格式的请求,但**body-parser并不支持解析multipart/form-data格式的请求**,所以发送form-data时req.body会一直是undefined。

解决方案

我们需要使用multer——Express生态中专门处理multipart/form-data的中间件,步骤如下:

1. 安装multer依赖

在项目根目录执行命令:

npm install multer

2. 修改server.js配置

引入并配置multer,同时修改POST接口的中间件:

const fs = require("fs");
const express = require("express");
const bodyParser = require("body-parser");
const mysql = require("mysql");
// 引入multer
const multer = require("multer");
const app = express();
const port = process.env.PORT || 5000;

// 配置multer:使用内存存储(不保存文件到磁盘),仅解析表单字段
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

// 其他数据库连接代码保持不变...

// 修改POST接口,添加upload.none()中间件解析form-data
app.post("/api/users", upload.none(), (req, res) => {
  let sql = "insert into users values (null,?,?,now(),now(),0)";
  let name = req.body.name;
  let dsc = req.body.dsc;
  let params = [name, dsc];
  console.log(params);
  connection.query(sql, params, (err, rows, fields) => {
    res.send(rows);
    // console.log(err);
    // console.log(rows);
  });
});

// 其他接口代码保持不变...

关键说明

  • upload.none()表示只解析表单中的文本字段,不处理文件上传;如果你的form-data需要上传文件,可以改用upload.single('fileFieldName')(单文件)或upload.array('fileFieldName', 5)(多文件)。
  • 配置完成后,form-data中的字段会被正常解析到req.body中,和你预期的一致。

验证方式

按照你的复现步骤重新发送form-data请求,此时req.body应该能正确获取到表单数据,接口也会返回200状态码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:54:07