Express 如何获取 POST 表单字段?
Express 4.16.1+ 用内置中间件 express.urlencoded() 解析表单,之后在 req.body 中读取字段;JSON 请求体用 express.json()。老版本用 body-parser。本文附完整示例与常见坑。
**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>
常见坑
req.body是 undefined:没挂中间件,或中间件没匹配到 Content-Type。表单用express.urlencoded(),JSON 用express.json(),两者按需都挂;- extended 选项选什么:
true用 qs 库解析(支持嵌套对象user[name]=x),false用 querystring(只支持平铺键值)。一般写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:字段拿不到但也不报错?
req.body.xxx 不存在时是 undefined,打印 req.body 整个对象先看结构,再核对表单 input 的 name 属性拼写。