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

Express已定义变量渲染到EJS页面报未定义错误如何解决

问题根因

你遇到的变量未定义报错核心原因有2个:

  1. GET请求访问/slot页面时,服务端仅传递了Name单个变量,EJS模板中用到的State、Name1、vaccine1等数组变量完全没有传递,模板渲染时找不到对应变量直接抛出异常。
  2. 你将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:36:00