无法定位问题:HTML表单或POST路由处理器致数据无法提交至MongoDB
问题排查与修复方案
1. HTML表单核心错误(导致req.body无数据)
你的表单标签错误地写了两个action属性,第二个本该是指定提交方法的method="POST"。表单提交的HTTP方法是通过method属性定义的,而非重复写action。默认不指定method时,表单会用GET方法提交,数据会拼在URL里,不会进入请求体,自然拿不到req.body数据。
修复后的survey.ejs表单代码:
<form action="/survey" method="POST" id="survey-form"> <select name="service" id="service" required> <option value="" disabled selected hidden>Type to search </option> <option value="option1">option1</option> <option value="option2">option2</option> <option value="option3">option3</option> </select> <br> <button type="submit">Submit</button> </form>
(顺便把form的id改成survey-form,避免和select的id重复,符合HTML唯一ID规范)
2. 路由代码语法错误(导致MongoDB插入失败)
调用insertMany时误用了方括号[],方法调用必须用圆括号(),这是基础语法错误。
修复后的routes/survey.js代码:
router.post('/', async(req, res) => { console.log('Before try catch statement') console.log(req.body) // 可以加这行确认是否拿到数据 try{ const data={ service: req.body.service } await Survey.insertMany(data) // 把[]改成() res.render('index') }catch (e){ console.log(e) } })
3. 额外验证点
- 你已正确挂载
express.urlencoded中间件app.use(express.urlencoded({ extended: false})),这部分无需修改。 - 建议在路由里先打印
req.body,确认数据正常接收后,再执行数据库插入操作。
内容的提问来源于stack exchange,提问作者eddie
相关产品推荐
相关产品推荐

