Express 如何获取 POST 表单字段?

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

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

**Express 4.16.0 及以上:挂内置中间件 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, password } = req.body || {};
  if (typeof username !== "string" || typeof password !== "string") {
    return res.status(400).send("字段类型不正确");
  }
  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 不支持嵌套对象,但重复键仍可能产生数组,不能假定所有值都是字符串。一般写 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:字段拿不到但也不报错?
body 对象存在时,缺失属性才返回 undefined;body 本身未定义则直接访问会抛错,Express 4/5 默认行为也不同。检查脱敏后的字段名与类型,不打印包含密码的整个 body,再核对表单 input 的 name 属性拼写。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台