You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:54:02