EJS+Express+MongoDB开发网店出现products is not defined报错如何解决
问题根因排查与解决方案
1. 首页控制器未正确传递products变量到EJS模板
这是最高发的原因,检查你的home.controller.js里渲染首页的代码,确保res.render调用时第二个参数里包含products字段,正确写法示例:
// 错误写法示例(缺少products传递) const getHome = async (req, res) => { const products = await Product.find({}) res.render('index') // 没有把products传进去 } // 正确写法 const getHome = async (req, res) => { try { const products = await Product.find({}) res.render('index', { products }) // ES6简写等价于{ products: products } } catch (err) { console.error(err) // 异常分支也要传递products变量,避免报错 res.render('index', { products: [] }) } }
2. EJS模板中变量使用未做非空判断
如果控制器已经传递了变量,但在数据库查询返回空、或者异步逻辑执行异常时变量可能为undefined,EJS直接调用会报错。在EJS模板中使用变量前先做判断,示例:
<!-- 错误写法 --> <% products.forEach(product => { %> <div class="product-item"><%= product.name %></div> <% }) %> <!-- 正确写法,先判断变量存在再遍历 --> <% if(locals.products && products.length) { %> <% products.forEach(product => { %> <div class="product-item"><%= product.name %></div> <% }) %> <% } else { %> <p>暂无上架商品</p> <% } %>
提示:EJS的locals对象里存储了所有传递到视图的变量,用locals.products访问可以避免直接调用未定义变量抛错
3. 商品模型查询逻辑错误导致变量未赋值
检查products.model.js的导出是否正确,以及控制器中是否正确引入了模型:
- 模型导出正确写法示例:
// products.model.js const mongoose = require('mongoose') const productSchema = new mongoose.Schema({ name: String, price: Number, // 其他自定义字段 }) module.exports = mongoose.model('Product', productSchema)
- 控制器正确引入示例:
// home.controller.js 头部引入代码,路径要和你的文件实际位置对应 const Product = require('./models/products.model.js')
4. app.js中视图引擎配置错误
检查app.js里的EJS配置是否正确,确保没有写错视图路径:
const express = require('express') const app = express() // 以下两行配置缺一不可 app.set('view engine', 'ejs') app.set('views', './views') // 确保路径对应你存放EJS模板的文件夹位置
按照上述顺序排查即可解决问题,90%以上的同类报错都是控制器渲染时未传递products参数导致的。
内容的提问来源于stack exchange,提问作者Saady Ashraf
相关产品推荐
相关产品推荐

