Express 如何获取 POST 表单字段?

Express 4.16.1+ 用内置中间件 express.urlencoded() 解析表单,之后在 req.body 中读取字段;JSON 请求体用 express.json()。老版本用 body-parser。本文附完整示例与常见坑。

最佳实践
Node.js 事件循环与异步任务示意

**Express 4.16.1 及以上:挂内置中间件 express.urlencoded(),然后从 req.body 读字段。**不需要装 body-parser。

完整示例

npm install express
const express = require('express');
const app = express();

// 解析 application/x-www-form-urlencoded(HTML 表单默认格式)
app.use(express.urlencoded({ extended: true }));

// 如果还要收 JSON,再挂一个
app.use(express.json());

app.post('/submit-form', (req, res) => {
  const username = req.body.username;
  const password = req.body.password;
  console.log('Username:', username);
  res.send('表单提交成功!');
});

app.listen(3000, () => console.log('监听 3000 端口'));

对应 HTML 表单:

<form action="/submit-form" method="post">
  <input name="username" />
  <input name="password" type="password" />
  <button type="submit">提交</button>
</form>

常见坑

  1. req.body 是 undefined:没挂中间件,或中间件没匹配到 Content-Type。表单用 express.urlencoded(),JSON 用 express.json(),两者按需都挂;
  2. extended 选项选什么:true 用 qs 库解析(支持嵌套对象 user[name]=x),false 用 querystring(只支持平铺键值)。一般写 true;
  3. 老项目用 body-parser:Express ≤4.16.0 需要 npm install body-parser 然后 app.use(bodyParser.urlencoded({extended: true})),效果一样;
  4. 文件上传不管用这两个中间件:multipart/form-data 要用 multer、busboy 等专门中间件。

常见问题(FAQ)

Q:GET 请求的参数也从 req.body 读吗?
不是。GET 查询参数在 req.query,路径参数在 req.params,POST 表单体才在 req.body。

Q:前端用 fetch 发 JSON,后端读不到?
确认前端设了 Content-Type: application/json,且后端挂了 express.json()——两头缺一个都读不到。

Q:字段拿不到但也不报错?
req.body.xxx 不存在时是 undefined,打印 req.body 整个对象先看结构,再核对表单 input 的 name 属性拼写。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台