EJS页面渲染失败:donors变量未定义引发ReferenceError求助
问题原因分析
1. 重复路由引发的匹配错误
你定义了两个GET /donors路由,其中第二个路由仅传递空对象渲染页面,未携带donors变量。Express的路由匹配遵循从上到下的定义顺序,如果这个空参数路由定义在带数据库查询的路由之前,所有GET /donors请求都会被它拦截,直接渲染缺少donors的页面,触发ReferenceError。
另外,你还定义了GET /views/donors.ejs路由,同样未传递donors,如果按钮跳转的是这个路径,也会直接触发报错。
2. 前端跳转路径错误
若前端按钮直接指向/views/donors.ejs,会跳过正常的路由逻辑,没有经过数据库查询和变量传递步骤,自然不存在donors变量。
解决方案
1. 删除多余无效路由
直接移除这两个空参数路由,只保留包含数据库查询、传递完整变量的GET /donors路由:
// 删除以下两个路由 app.get('/donors', (req, res) => { res.render('donors.ejs', {}); }); app.get('/views/donors.ejs', (req, res) => { res.render('donors.ejs', {}); });
2. 修正前端按钮跳转路径
确保按钮跳转目标为标准路由/donors,而非直接指向视图文件:
<!-- 正确写法 --> <a href="/donors" class="btn">查看捐赠者</a> <!-- 错误写法,请修改 --> <a href="/views/donors.ejs" class="btn">查看捐赠者</a>
3. 增强EJS页面容错性(可选)
虽然解决路由问题是核心,但可以给EJS的判断逻辑增加变量存在性检查,避免意外报错:
<div class="container mt-5"> <div class="row justify-content-center"> <% if (typeof donors !== 'undefined' && donors && donors.length > 0) { %> <% donors.forEach(donor => { %> <div class="col-12 col-sm-6 col-lg-4 mb-4"> <div class="card" style="background-color: #D27878;"> <div class="card-body"> <h5 class="card-title"><%= donor.full_name %></h5> <p class="card-text">Blood Type: <%= donor.blood_type %></p> <p class="card-text">City: <%= donor.city_name %></p> <p class="card-text">Phone: <%= donor.phone_number %></p> </div> </div> </div> <% }); %> <% } else { %> <p>No donors found.</p> <% } %> </div> </div>
内容的提问来源于stack exchange,提问作者Software Engineer
相关产品推荐
相关产品推荐

