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> <% } %>
问题原因
- 变量缺失:当
flight.length > 0不成立时,控制器只传递了noFlightsAvailable: true,没有传递flight变量。但模板第一行就尝试访问flight,直接触发未定义报错——因为变量不存在,flight && ...的短路判断根本执行不了。 - 变量名冲突: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
相关产品推荐
相关产品推荐

