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

MongoDB查询返回null致EJS渲染报错,前端却正常显示

问题分析与解决方案

问题根源

你的代码仅处理了MongoDB查询出错的场景(err存在时渲染错误页面),但完全忽略了查询成功但无匹配文档的情况:此时foundAnswer会返回null,但你依然会渲染nptel_weeksAnswer模板,EJS尝试访问null.week就会抛出报错。而当查询到匹配文档时,前端能正常显示,所以出现了“功能正常但后端偶尔报错”的矛盾现象。

解决方案一:后端提前拦截无结果场景

修改后端路由代码,在确认无查询错误后,额外判断foundAnswer是否存在,不存在则渲染错误页面:

app.get('/nptel/:courseName/:weekNumber', function (req, res) {
  Nptel.findOne(
    {
      nptel_name: req.params.courseName,
      week: req.params.weekNumber,
    },
    (err, foundAnswer) => {
      if (err) {
        return res.render('error');
      }
      // 新增:无匹配文档时跳转错误页
      if (!foundAnswer) {
        return res.render('error', { message: '未找到对应周次的答案' });
      }
      res.render('nptel_weeksAnswer', {
        foundAnswer: foundAnswer,
      });
    }
  );
});

解决方案二:EJS层面做防御性访问

如果不想修改后端逻辑,也可以在EJS模板里先判断foundAnswer是否存在,再访问其属性:

<div class="col"><h1>Week <%= foundAnswer ? foundAnswer.week : '未找到' %> :</h1></div>
<div class="nptel_answer mb-2">
   <div class="nptelQ"><h4><%= foundAnswer ? foundAnswer.question_1 : '' %></h4></div>
   <div class="nptelA"><h5><%= foundAnswer ? foundAnswer.answer_1 : '' %></h5></div>
</div>

额外提示

建议优先采用方案一,因为后端提前拦截无结果的情况,能更合理地引导用户(比如显示明确的“未找到”提示),而不是让模板渲染出不完整的内容。

内容的提问来源于stack exchange,提问作者Vinit P. Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:22:59