如何在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
相关产品推荐
相关产品推荐

