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

EJS模板传入变量仍提示未定义问题求助

EJS模板变量未定义报错,已传递变量且重启服务器无效

问题场景

已在控制器中将变量传递给EJS模板,但始终收到flight is not defined这类变量未定义的报错,重启服务器也无法解决。

相关代码

flightsController.js

if (flight.length > 0) {
    if (returnTicket) {
        const returnFlight = await Flights.find({
            sourceIATA: destinationIATA,
            destinationIATA: sourceIATA,
        });

        if (returnFlight.length > 0) {
            res.render("flights", { flight, returnFlight });
        } else {
            res.render("flights", { flight, noReturnFlights: true });
        }
    } else {
        res.render("flights", { flight });
    }
} else {
    res.render("flights", { noFlightsAvailable: true });
}

flights.ejs

<% if (flight && flight.length > 0) { %>
    <h2>Flights:</h2>
    <ul>
      <% flight.forEach(flight => { %>
        <li>Flight ID: <%= flight.flightId %></li>
        <li>Source City: <%= flight.sourceCity %></li>
        <li>Destination City: <%= flight.destinationCity %></li>
        <!-- Display other flight details as needed -->
        <br>
      <% }); %>
    </ul>
  <% } %>

  <% if (noReturnFlights) { %>
    <h2>No Return Flights Available</h2>
  <% } %>

  <% if (noFlightsAvailable) { %>
    <h2>No Flights Available</h2>
  <% } %>

问题原因

  1. 变量缺失:当flight.length > 0不成立时,控制器只传递了noFlightsAvailable: true,没有传递flight变量。但模板第一行就尝试访问flight,直接触发未定义报错——因为变量不存在,flight && ...的短路判断根本执行不了。
  2. 变量名冲突:EJS模板里的循环flight.forEach(flight => {})会用循环变量覆盖外层的flight数组,可能导致后续逻辑出现意料之外的问题。

修复方案

1. 确保所有渲染分支都传递flight变量

修改控制器的else分支,添加空数组形式的flight变量:

if (flight.length > 0) {
    if (returnTicket) {
        const returnFlight = await Flights.find({
            sourceIATA: destinationIATA,
            destinationIATA: sourceIATA,
        });

        if (returnFlight.length > 0) {
            res.render("flights", { flight, returnFlight });
        } else {
            res.render("flights", { flight, noReturnFlights: true });
        }
    } else {
        res.render("flights", { flight });
    }
} else {
    // 传递空的flight数组,避免模板报错
    res.render("flights", { flight: [], noFlightsAvailable: true });
}

2. 解决EJS模板的变量名冲突

把循环变量改成不重复的名称,比如flightItem:

<% if (flight && flight.length > 0) { %>
    <h2>Flights:</h2>
    <ul>
      <% flight.forEach(flightItem => { %>
        <li>Flight ID: <%= flightItem.flightId %></li>
        <li>Source City: <%= flightItem.sourceCity %></li>
        <li>Destination City: <%= flightItem.destinationCity %></li>
        <!-- Display other flight details as needed -->
        <br>
      <% }); %>
    </ul>
  <% } %>

  <% if (noReturnFlights) { %>
    <h2>No Return Flights Available</h2>
  <% } %>

  <% if (noFlightsAvailable) { %>
    <h2>No Flights Available</h2>
  <% } %>

验证逻辑

修改后,无论哪种分支情况,模板都能拿到flight变量(空数组或有效数据),不会触发未定义报错;同时变量名冲突的问题也得到解决,避免潜在的逻辑错误。

内容的提问来源于stack exchange,提问作者prav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:17:33