Express 如何获取 POST 表单字段?
Express 4.16.0+ 用内置中间件 express.urlencoded() 解析表单,之后在 req.body 中读取字段;JSON 请求体用 express.json()。老版本用 body-parser。本文附完整示例与常见坑。
**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>
常见坑
req.body是 undefined:没挂中间件,或中间件没匹配到 Content-Type。表单用express.urlencoded(),JSON 用express.json(),两者按需都挂;- extended 选项选什么:
true用 qs 库解析(支持嵌套对象user[name]=x),false 不支持嵌套对象,但重复键仍可能产生数组,不能假定所有值都是字符串。一般写true; - 老项目用 body-parser:Express <4.16.0 需要
npm install body-parser然后app.use(bodyParser.urlencoded({extended: true})),效果一样; - 文件上传不管用这两个中间件: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 属性拼写。