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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:05:57