Express接收表单提交时req.body.fname返回undefined问题排查
问题原因
req.body返回undefined是请求体解析中间件未正常生效导致的,结合你的代码,核心诱因有两点:
- 独立安装的
body-parser包与当前Express版本存在兼容问题:Express 4.16.0及以上版本已内置URL-encoded、JSON格式的请求体解析能力,额外引入独立版本的body-parser很容易因版本不匹配导致解析失效。 - 代码中存在错误的模块引入语句,存在引发隐式运行异常的可能。
修复方案
按以下步骤调整代码即可:
- 删除冗余、错误的代码
移除以下两行无效代码:
如果后续需要处理文件路径,直接引入Node.js核心path模块即可:var bodyParser = require('body-parser'); const { path } = require('express/lib/application');const path = require('path') - 替换为Express内置的请求体解析中间件
将原来的body-parser解析配置替换为内置解析器,注意所有解析中间件必须写在静态资源配置、路由配置之前,否则不会生效:// 解析原生表单默认的application/x-www-form-urlencoded格式请求体 app.use(express.urlencoded({ extended: true })) // 解析JSON格式请求体 app.use(express.json()) - 补全POST路由的响应逻辑
原代码中POST路由未给客户端返回响应,会导致请求一直挂起,补充返回逻辑即可。 - 排查静态文件冲突
检查public文件夹下是否存在同名Signup.html文件,不要同时在项目根目录、public目录下存放同名HTML文件,避免访问到错误版本的前端页面。测试时请访问http://localhost:3000走GET路由返回页面,不要直接访问/Signup.html路径。
修正后的完整服务端代码
var express = require('express'); var request = require('request'); var app = express(); // 请求体解析中间件必须放在最前面 app.use(express.urlencoded({ extended: true })) app.use(express.json()) app.use(express.static('public')) app.get('/', function (req, res) { res.sendFile(__dirname + "/Signup.html") }) app.post('/Signup.html', function (req, res) { var fname = req.body.fname var lname = req.body.lastname var email = req.body.email console.log(fname, lname, email) // 给客户端返回响应 res.send(`提交成功:姓名${fname} ${lname},邮箱${email}`) }) app.listen(3000, function () { console.log("Running in 3000 ") })
异常排查
如果调整后仍无法正常获取值,可以在POST路由最开始添加一行console.log(req.headers['content-type']),确认表单提交的Content-Type值为application/x-www-form-urlencoded:
- 如果值为
multipart/form-data,说明表单添加了enctype="multipart/form-data"属性,这种格式用于文件上传,需要使用multer等中间件解析,普通字段场景删除该属性即可。 - 如果没有Content-Type字段,说明前端提交逻辑被篡改,检查是否有额外的JS脚本拦截了原生表单提交。
内容的提问来源于stack exchange,提问作者Aswin
相关产品推荐
相关产品推荐

