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

NodeJS新手遇EJS模板data未定义错误:MongoDB数据渲染失败

EJS模板中data未定义问题的解决方案

我是一名NodeJS新手开发者,尝试从MongoDB获取数据并渲染至index.ejs文件中展示,但报错提示<% data.forEach(post => { %>行内data未定义。

我的代码:

路由文件 main.js

const express = require('express');
const router = express.Router();
const Post = require('../models/posts');


router.get('', async (req, res) => {

    const locals = {
        title: 'Blog Post',
        description: "A blog website created using Node.js, Express, and MongoDB."
    }
    
    try {
        const data = await Post.find();
        res.render('index', { locals, data });
    } 
    catch(err) {
        console.error(err);
        res.status(500).send("Server Error");
    }
});

module.exports = router;

模板文件 index.ejs

<ul class="article-ul">

    <% data.forEach(post => { %>
    <li>
      <a href="">
        <span><%= post.title %> </span>
        <span class="article-list__date"> <%= post.createdAt %> </span>
      </a>
    </li>
    <% }) %>

  </ul>

解决步骤:

  1. 修正路由路径
    空字符串''作为路由路径可能无法正确匹配根请求,改为明确的根路径:

    router.get('/', async (req, res) => {
        // 原有逻辑不变
    });
    
  2. 确认路由挂载正确
    检查主应用入口文件(如app.js),确保已引入并挂载该路由:

    const express = require('express');
    const app = express();
    const mainRouter = require('./routes/main'); // 路径根据项目结构调整
    
    app.set('view engine', 'ejs');
    app.use('/', mainRouter); // 将路由挂载到根路径
    
    app.listen(3000, () => console.log('Server running on port 3000'));
    
  3. 验证MongoDB连接与模型

    • 主入口文件必须包含MongoDB连接代码:
      const mongoose = require('mongoose');
      mongoose.connect('mongodb://localhost:27017/your-db-name')
        .then(() => console.log('MongoDB连接成功'))
        .catch(err => console.error('MongoDB连接失败:', err));
      
    • 确认../models/posts的模型定义正确:
      const mongoose = require('mongoose');
      
      const postSchema = new mongoose.Schema({
        title: String,
        createdAt: { type: Date, default: Date.now }
        // 其他字段按需添加
      });
      
      module.exports = mongoose.model('Post', postSchema);
      
  4. 优化变量传递(可选)
    将locals与data合并为一个对象传递,模板变量使用更直观:

    res.render('index', { ...locals, data });
    
  5. 模板添加容错判断
    在EJS中增加data的存在性判断,避免未定义时崩溃:

    <ul class="article-ul">
        <% if (data && data.length) { %>
            <% data.forEach(post => { %>
            <li>
              <a href="">
                <span><%= post.title %> </span>
                <span class="article-list__date"> <%= post.createdAt %> </span>
              </a>
            </li>
            <% }) %>
        <% } else { %>
            <li>暂无文章</li>
        <% } %>
    </ul>
    

内容的提问来源于stack exchange,提问作者Abir Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:05:11