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

如何获取Sequelize与MySQL的对象数组?解决EJS遍历问题

解决Sequelize查询结果无法在EJS中遍历的问题

你的代码存在两个核心问题,导致无法正常传递可遍历的数组到EJS:

  • 每次循环都重新创建result数组,且只存入当前元素,最后传递给EJS的是单个元素的数组,而非完整列表
  • 在循环内部调用res.render,会触发多次响应,这不仅不符合HTTP规范,也会导致后续循环的渲染无效

下面是几种可行的修复方案:

方案1:正确收集所有数据后一次性渲染

把result数组的声明移到循环外,遍历完所有查询结果后再调用res.render:

products_dataBase.findAll()
  .then(products => {
    const result = [];
    products.forEach(element => {
      result.push(element.dataValues);
    });
    // 循环结束后统一渲染视图
    res.render('home.ejs', { result });
    console.log(result);
  })
  .catch(err => {
    console.log(err);
  });

方案2:让Sequelize直接返回纯数据对象

通过findAll的raw: true选项,直接获取不含Sequelize实例包装的纯JSON数组,无需手动提取dataValues:

products_dataBase.findAll({ raw: true })
  .then(result => {
    // 直接传递查询结果到EJS
    res.render('home.ejs', { result });
    console.log(result);
  })
  .catch(err => {
    console.log(err);
  });

方案3:用map方法简洁转换实例数组

利用数组的map方法快速将Sequelize实例数组转为纯对象数组,代码更简洁:

products_dataBase.findAll()
  .then(products => {
    const result = products.map(product => product.dataValues);
    res.render('home.ejs', { result });
    console.log(result);
  })
  .catch(err => {
    console.log(err);
  });

EJS中遍历数组的写法

修复后端代码后,在EJS中可以直接用forEach遍历result数组:

<% if (result && result.length > 0) { %>
  <% result.forEach(product => { %>
    <div class="product-card">
      <h3><%= product.title %></h3>
      <p>价格:<%= product.price %></p>
      <p><%= product.description %></p>
    </div>
  <% }) %>
<% } else { %>
  <p>暂无产品</p>
<% } %>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:55:19