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
相关产品推荐
相关产品推荐

