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

