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

