Express应用注册表单POST请求提示name is not defined错误如何解决
问题原因
- Express默认不会解析POST请求的请求体,未配置对应中间件的情况下
req.body默认值为undefined,尝试读取req.body.name自然会触发变量未定义的报错 - 你当前表单配置了
enctype="multipart/form-data"编码格式,该格式专为带文件上传的场景设计,普通表单不需要该配置,且该格式无法通过Express自带的解析中间件解析,需要额外配置专用中间件
解决方法
方案1:无文件上传需求(适用于你当前的普通注册表单场景,推荐)
- 修改
register.hbs中的表单标签,删除多余的enctype="multipart/form-data"属性:
<form action="/register" method="post">
- 在
app.js中添加Express自带的请求体解析中间件,添加位置在静态资源配置之后、路由配置之前即可:
// 解析json格式请求体 app.use(express.json()) // 解析表单默认的urlencoded格式请求体 app.use(express.urlencoded({extended: false}))
修改后重启服务即可正常读取req.body.name的值。
方案2:需要保留multipart/form-data格式(后续有文件上传需求时使用)
- 安装专用解析中间件multer:
npm install multer - 在
app.js中引入并配置multer:
var multer = require('multer') var upload = multer() // 仅解析表单字段、不处理文件上传时用该配置
- 修改
/register的POST路由,挂载multer中间件:
app.post('/register', upload.none(), (req,res)=>{ const name = req.body.name; console.log(name); res.render('index'); })
修改后重启服务即可正常获取表单参数。
内容的提问来源于stack exchange,提问作者Harshil Sharma
相关产品推荐
相关产品推荐

