Express中Form-Data请求req.body为空,JSON请求正常的问题
解决Express无法解析Form-Data导致req.body为空的问题
问题根源是你当前用的express.json()和express.urlencoded()中间件只能处理JSON格式和application/x-www-form-urlencoded格式的请求,完全不支持multipart/form-data(也就是你用的Form-Data),所以这类请求的参数根本没被解析到req.body里。
解决步骤:
- 安装multer依赖
multer是Express官方推荐的解析multipart/form-data的中间件,执行命令安装:
npm install multer
- 在app.js中配置并使用multer
根据需求分两种场景:
- 仅解析Form-Data里的文本字段(不需要上传文件):
在app.js中引入multer,添加对应中间件(要放在路由注册前):
// 在app.js顶部新增 const multer = require('multer'); // 在express.urlencoded之后添加这一行 app.use(multer().none()); // .none()表示只处理文本字段,不解析文件
- 需要支持文件上传:
可以配置multer的存储路径,自定义文件名:
const multer = require('multer'); // 配置文件存储位置和命名规则 const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './public/uploads') // 确保项目下存在uploads文件夹 }, filename: function (req, file, cb) { cb(null, Date.now() + '-' + file.originalname) } }); const upload = multer({ storage: storage }); // 全局使用(所有路由都支持Form-Data) app.use(upload.any()); // 或针对单个路由使用,比如注册接口: // userRouter.route("/register").post(upload.any(), registerUser);
- 修改后的app.js关键代码示例
const express = require("express"); const cors = require("cors"); const path = require("path"); const cookie = require("cookie-parser"); const session = require("express-session"); const MongoStore = require("connect-mongo"); const passport = require("passport"); const multer = require('multer'); // 新增 const dbName = require("./constants.js").DB_Name; const app = express(); app.use( cors({ origin: process.env.CORS_ORIGIN, credentials: true, }) ); app.use(express.json()); app.use(express.urlencoded({ extended: true, limit: "16kb" })); app.use(multer().none()); // 新增:解析Form-Data文本字段 app.use(require("morgan")("dev")); app.use(express.static(path.join(__dirname, "public"))); app.use(cookie()); // ... 其余session、passport配置保持不变 ... const { userRouter } = require("./router/user.routes.js"); app.use("/api/v1/auth", userRouter); module.exports.app = app;
- 测试验证
重启Express服务后,用Postman发送Form-Data格式请求到/api/v1/auth/success,控制台打印的req.body就能正常显示你提交的参数了。
内容的提问来源于stack exchange,提问作者Raj Patel
相关产品推荐
相关产品推荐

