EJS提交roll number查MongoDB成绩报Query already executed错误如何解决
问题根因
你遇到的报错核心是Mongoose不允许同时对同一个查询使用await和回调函数,两种查询方式二选一即可,同时使用会触发两次查询执行,就抛出了Query was already executed的错误。除此之外还有两处逻辑问题导致功能无法正常运行,统一修复方案如下:
1. 修复后端查询代码
两种写法二选一即可,不要同时使用await和回调:
写法1:仅用async/await(更推荐)
async result(req,res){ try{ // 获取前端表单提交的rollno参数,不要写死固定值 const rollno = req.query.rollno; // 用户未提交查询时直接渲染空页面 if(!rollno) return res.render('result', {details: null}); // 注意:如果数据库中rollno字段是Number类型,这里要做类型转换:const rollno = Number(req.query.rollno) const allDetails = await studentResult.find({rollno: rollno}); res.render('result',{details: allDetails}) }catch (e){ console.log(e); res.status(500).send('查询出错') } },
写法2:仅用回调函数
result(req,res){ const rollno = req.query.rollno; if(!rollno) return res.render('result', {details: null}); studentResult.find({rollno: rollno},function(err,allDetails){ if(err){ console.log(err); return res.status(500).send('查询出错') } res.render('result',{details: allDetails}) }) },
2. 前端EJS可选优化
- 表单显式声明请求方式避免歧义:将
<form action="/result">改为<form action="/result" method="GET"> - 修正提示文本错误:把
Enter your phone number for result改为Enter your roll number for result,和实际提交的字段逻辑匹配。
内容的提问来源于stack exchange,提问作者Shamshad Hussain
相关产品推荐
相关产品推荐

