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>
解决步骤:
修正路由路径
空字符串''作为路由路径可能无法正确匹配根请求,改为明确的根路径:router.get('/', async (req, res) => { // 原有逻辑不变 });确认路由挂载正确
检查主应用入口文件(如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'));验证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);
- 主入口文件必须包含MongoDB连接代码:
优化变量传递(可选)
将locals与data合并为一个对象传递,模板变量使用更直观:res.render('index', { ...locals, data });模板添加容错判断
在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
相关产品推荐
相关产品推荐

