Express处理POST请求时无法获取HTML表单输入值如何解决?
问题原因
- 表单编码类型不匹配:你的register.hbs中form标签设置了
enctype="multipart/form-data"属性,该编码类型仅用于包含文件上传的表单场景。而你在app.js中配置的express.urlencoded、body-parser中间件均不支持解析该编码格式的请求体,所以无法读取到req.body下的表单字段值,返回undefined。 - 解析中间件重复配置:你同时引入了第三方
body-parser和Express内置的请求体解析中间件,二者功能完全重叠,可能出现优先级冲突导致解析异常。Express 4.16+版本已经内置了json和urlencoded解析能力,无需额外安装body-parser。
解决方案
根据你的使用场景二选一即可:
场景1:当前表单不需要上传文件
直接删除register.hbs中form标签的enctype="multipart/form-data"属性即可,表单默认使用application/x-www-form-urlencoded编码,可直接被现有中间件解析。
修改后的form标签代码:<form action="/register" method="post">同时可以清理app.js中冗余的body-parser配置,优化后的解析配置段:
// 删掉原有的body-parser相关代码,保留以下两行即可 app.use(express.json()); app.use(express.urlencoded({ extended: true }));场景2:后续需要支持文件上传功能
保留enctype="multipart/form-data"属性,安装multer中间件解析该类型请求体:- 安装依赖:
npm install multer - 在app.js中引入并配置multer:
const multer = require('multer'); // 仅需要获取文本表单字段时使用none()配置 const upload = multer({ storage: multer.memoryStorage() }); // 给post路由添加multer中间件 app.post('/register', upload.none(), (req,res)=>{ const name = req.body.name; console.log(req.body.name); res.render('index'); })- 安装依赖:
内容的提问来源于stack exchange,提问作者Harshil Sharma
相关产品推荐
相关产品推荐

