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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:45:01