Express已定义变量渲染到EJS页面报未定义错误如何解决
问题根因
你遇到的变量未定义报错核心原因有2个:
- GET请求访问
/slot页面时,服务端仅传递了Name单个变量,EJS模板中用到的State、Name1、vaccine1等数组变量完全没有传递,模板渲染时找不到对应变量直接抛出异常。 - 你将
State、Name1这类查询结果数组定义为全局变量,多用户并发请求时会出现数据串用的问题,同时如果COWIN接口返回的接种点数据为空,数组没有元素时你写死的i<2循环也会读取到不存在的索引值。
修复步骤
1. 修正GET /slot路由的传参
修改app.get("/slot")的渲染逻辑,给所有模板用到的变量传默认空值:
app.get("/slot", function(req,res){ res.render("slot",{ Name: Name, State: [], Name1: [], length1: [], vaccine1: [], AgeLimit1: [], Dose: [], Dose12: [], timming: [], timming12: [], Fees1: [], Address1: [], Slots1: [], Pincode1: [] }); });
2. 调整EJS模板的循环逻辑
不要写死循环次数为2,改为根据数组实际长度动态循环,没有数据时展示兜底提示:
<tbody> <% if(State.length > 0) { %> <% for(let i=0; i<State.length; i++){ %> <tr> <th scope="row"><%=State[i]%></th> <td ><%=Name1[i]%></td> <td ><%=vaccine1[i]%></td> <td ><%=AgeLimit1[i]%></td> <td ><%=Dose[i]%></td> <td ><%=Dose12[i]%></td> <td ><%=Fees1[i]%></td> <td ><%=Address1[i]%></td> <td ><%=Slots1[i]%></td> <td ><%=Pincode1[i]%></td> </tr> <% } %> <% } else { %> <tr> <td colspan="10" style="text-align:center">暂无接种点数据,请输入有效PINCODE查询</td> </tr> <% } %> </tbody>
3. 优化全局变量问题
将State、Name1等存储查询结果的数组从全局定义移动到app.post("/slot")的请求处理函数内部,每次请求初始化新的空数组,避免多用户数据串扰:
app.post("/slot",function(req,res){ // 把数组定义移到这里,每次请求都是全新的空数组 const Name1=[]; const length1= []; const State = []; const vaccine1 = []; const AgeLimit1 = []; const Dose = []; const Dose12 = []; const timming = []; const timming12 = []; const Fees1 = []; const Address1=[]; const Slots1 = []; const Pincode1 =[]; let pincode = req.body.pincode; let date = req.body.date; // 剩余原有逻辑不变 const url4 = "https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/findByPin?pincode="+pincode+"&date="+today.getDate(); https.get(url4,function(response){ response.on("data",function(data4){ let pincodeData = JSON.parse(data4); for(var i=0; i<pincodeData.sessions.length;i++ ){ let State1 = pincodeData.sessions[i].state_name; let length = pincodeData.sessions.length; let name = pincodeData.sessions[i].name; let vaccine = pincodeData.sessions[i].vaccine; let AgeLimit = pincodeData.sessions[i].min_age_limit; let Dose1 = pincodeData.sessions[i].available_capacity_dose1; let Dose2 = pincodeData.sessions[i].available_capacity_dose2; let timming1 = pincodeData.sessions[i].from; let timming2 = pincodeData.sessions[i].to; let Fees = pincodeData.sessions[i].fee_type; let Address = pincodeData.sessions[i].address; let slots = pincodeData.sessions[i].slots; let pincode2 = pincodeData.sessions[i].pincode; Name1.push(name); State.push(State1); length1.push(length); vaccine1.push(vaccine); AgeLimit1.push(AgeLimit); Dose.push(Dose1); Dose12.push(Dose2); timming.push(timming1); timming12.push(timming2); Fees1.push(Fees); Address1.push(Address); Slots1.push(slots); Pincode1.push(pincode2); } res.render("slot",{Name:Name,State:State,Name1:Name1,length1:length1,vaccine1:vaccine1,AgeLimit1:AgeLimit1,Dose:Dose,Dose12:Dose12,timming:timming,timming12:timming12,Fees1:Fees1,Address1:Address1,Slots1:Slots1,Pincode1:Pincode1}); }); }); });
内容的提问来源于stack exchange,提问作者Mayank Dahiya
相关产品推荐
相关产品推荐

