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

EJS模板渲染Mongoose.find()结果报lessons.forEach不是函数如何解决

报错原因

lessons.forEach is not a function 报错的核心原因是传递给EJS模板的 lessons 变量不是数组类型,仅数组支持调用forEach遍历方法。
结合贴出的后端代码,常见触发场景有3种:

  • Mongoose的find查询默认返回被包装过的Mongoose文档集合,而非普通JS数组,特殊场景下会导致遍历方法失效
  • 查询无匹配结果时,业务逻辑误将null/undefined/单个对象赋值给lessons参数传递给模板
  • 存在其他路由同样渲染searchLesson.ejs模板,传递的lessons是单条数据对象而非数组
解决方案

1. 后端查询优化+参数校验

修改查询代码,新增lean()方法直接返回普通JS数组,同时做兜底处理保证传递的参数一定是数组:

Lesson.find({
  teacher: searchField
})
.lean() // 新增这行,返回纯JS对象数组,移除Mongoose文档包装
.then(lesson => {
  // 可新增日志排查服务端参数类型,上线后可删除
  console.log('查询结果是否为数组:', Array.isArray(lesson), lesson)
  res.render('searchLesson.ejs', {
    // 兜底处理,即使查询无结果也传递空数组,避免非数组类型传入模板
    lessons: lesson || []
  })
})

2. 前端模板兼容处理

在EJS模板调用forEach前先判断变量类型,从视图层避免报错:

<% if (Array.isArray(lessons) && lessons.length > 0) { %>
  <% lessons.forEach(item => { %>
    <!-- 原有课程渲染逻辑 -->
  <% }) %>
<% } else { %>
  <p>未查询到匹配的课程信息</p>
<% } %>

3. 路由逻辑排查

检查所有渲染searchLesson.ejs的路由逻辑,确保所有场景下传递给模板的lessons参数都是数组类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:54:03