如何将同一文章数据渲染至多个EJS视图?博客首页展示最新文章
解决多页面共享文章数据的问题
问题根源
你现在的问题出在三个地方:
- 首页
index.ejs的路由未查询文章数据并传递给模板,模板里的article_list变量根本不存在,自然返回undefined - 当前查询文章的代码只指定返回
title和author字段,没包含content,就算拿到数据也取不到内容 - EJS模板里不能用
array[-1]语法取数组最后一项,JavaScript里得用array[array.length - 1]或者倒序排序后取第一项
具体解决方案
1. 封装公共的文章查询函数
把文章查询逻辑抽成公共函数,方便多个路由复用:
// 可放在articleController.js中 const getArticles = (callback) => { Article.find({}, "title author content") // 新增content字段查询 .sort({ _id: -1 }) // 按MongoDB默认ID倒序(自带时间戳,最新文章排最前) .populate("author") .exec(callback); };
如果你的Schema里有createdAt字段,也可以替换成.sort({ createdAt: -1 }),逻辑更直观
2. 改造文章列表路由(保留原有功能)
原article_list函数调用公共查询函数,再按需求排序:
exports.article_list = function (req, res, next) { getArticles(function (err, list_articles) { if (err) { return next(err); } // 按标题正序排序,满足原页面展示需求 const sortedByTitle = list_articles.sort((a, b) => a.title.localeCompare(b.title)); res.render("article_list", { title: "Article List", article_list: sortedByTitle, }); }); };
3. 处理首页路由,传递最新文章数据
给首页路由添加数据查询逻辑,把需要的文章数据传给模板:
// 假设首页路由在对应控制器文件中 exports.index = function (req, res, next) { getArticles(function (err, list_articles) { if (err) { return next(err); } // 取最新的一篇文章(已倒序,直接取第一个元素) const latestArticle = list_articles[0]; res.render("index", { title: "首页", latest_article: latestArticle, // 单独传递最新文章 // 若需展示多篇,可传 article_list: list_articles.slice(0, 3) 取前3篇 }); }); };
4. 修正首页EJS模板代码
如果传递的是单独的latest_article,模板中这样写:
<!-- index.ejs 最新文章板块 --> <div class="latest-article-section"> <h3>最新文章</h3> <% if (latest_article) { %> <h4><%= latest_article.title %></h4> <p><%= latest_article.content %></p> <% } else { %> <p>暂无已发布文章</p> <% } %> </div>
如果传递的是完整article_list,取最新内容的写法:
<% if (article_list && article_list.length > 0) { %> <p><%= article_list[0].content %></p> <% } %>
额外提示
- 小博客场景下,每次请求查询数据库完全够用;如果后续流量增大,可引入Redis缓存查询结果优化性能
- 确保所有用到
Article模型的路由文件都已正确引入模型
内容的提问来源于stack exchange,提问作者Dagger
相关产品推荐
相关产品推荐

