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

如何在Node.js+EJS项目中遍历Sequelize查询结果生成动态用户卡片?

解决EJS中遍历Sequelize返回数据生成动态卡片的问题

我来帮你搞定这个问题~ 核心是先理清Sequelize返回的数据结构,再结合EJS的循环语法就能轻松生成动态卡片了,一步步来:


1. 先搞懂Sequelize返回的数据结构

你提到的两个方法返回的结构是关键:

  • findAndCountAll:返回的是包含count(总条数)和rows(实际数据数组)的对象,比如你拿到的gen里,gen.rows才是存着所有患者数据的数组
  • findAll:直接返回患者数据的数组,不需要再取子属性

2. 优化你的后端代码

先调整一下你传递给EJS的数据,让后续渲染更简单:

Login: async(req,res,next) => { 
  try { 
    if(!req.body){ 
      throw new Error("sorry no data"); 
    } 
    const { name, password} = req.body; 
    console.log("b",name) 
    const user= await models.machine.findOne({ 
      where:{ name: m_name }, // 这里注意变量名,你原代码里写的m_name应该是name?
    }); 
    if (user) { 
      let isPassWordCorrect = await bcrypt.compare(password,user.password) 
      if(isPassWordCorrect){ 
        const gen= await models.patient_data.findAndCountAll({ 
          attributes:[ "p_id","gender","name", ], 
          where:{ m_name: machine_name } // 同样注意变量名是否正确
        }); 
        // 直接把rows数组传给EJS,避免在模板里再嵌套一层
        res.render('dash',{ posts: gen.rows }) 
        // 如果需要用到总条数(比如分页提示),可以一起传:{ posts: gen.rows, totalPatients: gen.count }
      } else { 
        res.redirect('/Login') 
      } 
    } else { 
      res.status(400).json({ message:"unsuccess, an error occured", }) 
    } 
  } catch (err) { 
    res.status(400).json({ message:err.toString(), }); 
  } 
}

小提示:你原代码里的console.log(posts)是无效的,因为posts是传给EJS的变量名,后端上下文里并没有这个变量,改成console.log(gen.rows)才能看到实际数据。

3. 在EJS中遍历数据生成动态卡片

现在posts已经是患者数据的数组了,用EJS的forEach循环就能逐个生成卡片:

<!-- dash.ejs 模板内容 -->
<div class="patient-cards-wrapper">
  <!-- 先处理空数据的情况 -->
  <% if (posts.length === 0) { %>
    <p class="empty-tip">暂无患者数据</p>
  <% } else { %>
    <% posts.forEach(patient => { %>
      <div class="patient-card">
        <div class="card-header">
          <h3>患者ID:<%= patient.p_id %></h3>
        </div>
        <div class="card-body">
          <p>姓名:<%= patient.name %></p>
          <p>性别:<%= patient.gender %></p>
        </div>
      </div>
    <% }) %>
  <% } %>
</div>

这里要注意:Sequelize返回的模型实例(比如patient)不需要去dataValues里取值,直接通过patient.属性名就能拿到数据,框架已经做了属性代理,非常方便。

如果你之前没改后端,还是把整个gen对象传给了EJS,那模板里就要遍历posts.rows,其他逻辑和上面一致:

<% posts.rows.forEach(patient => { %>
  <!-- 卡片内容同上 -->
<% }) %>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:37:41