Node.js/Express中req.body始终为空排查(已安装body-parser)
问题描述
尝试获取HTML输入框中用户输入的文本并将其推入数组,但请求体(req.body)始终为空。已尝试调整代码顺序但无济于事,附上app.js、routes/game.js及EJS模板代码,请问问题出在哪里?
app.js 文件
const path = require('path'); const express = require('express'); const bodyParser = require('body-parser'); const gameRouter = require('./routes/game.js'); const siteRouter = require('./routes/site.js'); const app = express(); app.set('view engine', 'ejs'); app.set('views', 'views'); app.use(bodyParser.urlencoded({extended: false})); app.use(express.static(path.join(__dirname, 'public'))); app.use('/game', gameRouter); app.use('/', siteRouter); app.listen(3000);
routes/game.js 文件
const express = require('express'); const router = express.Router(); const games = []; router.get('/game', (req, res, next) => { }); router.post('/create', (req, res, next) => { console.log(req.body); games.push({game: req.body.game}) res.redirect('/'); }) module.exports = router;
EJS 模板文件
<%- include('./includes/head.ejs') %> </head> <body> <%- include('./includes/nav.ejs') %> <h1>Create a new Game</h1> <main> <form action="/game/create" method="POST"> <div> <input type="text" id="game"> <button type="submit">start</button> </div> </form> </main> <%- include('./includes/end.ejs') %>
问题原因与解决办法
核心问题是HTML输入框缺少name属性:
- 表单提交数据时,只有带有
name属性的表单字段才会被浏览器包含到请求体中; body-parser依赖字段的name属性解析生成req.body的键值对,仅设置id属性无法被识别。
修改EJS模板中的输入框,添加name="game"属性即可解决:
<input type="text" id="game" name="game">
修改后再次提交表单,req.body.game就能正确获取用户输入的文本,req.body也不会为空。
内容的提问来源于stack exchange,提问作者NickAutomatic
相关产品推荐
相关产品推荐

