Express+EJS博客分类搜索页面无法加载对应分类数据问题
问题排查与解决方案
核心问题分析
- 查询字段缺失:
Article.find({}, "title")仅指定返回title字段,导致返回的文章对象中没有category、author属性,前端判断article.category === id永远不成立。 - 前端逻辑错误:循环中每遇到不匹配的文章就输出一次提示,导致20篇文章重复显示20次提示,而非所有文章都不匹配时才显示一次。
- 查询效率低下:先查询所有文章再在前端过滤,不如直接在数据库层面按分类筛选。
修复步骤
1. 修正数据库查询逻辑
修改search控制器,直接按分类筛选并返回所需字段:
exports.search = async function (req, res, next) { const category = req.params.id; // 按分类筛选,返回完整文章数据(可省略第二个参数,默认返回所有字段) Article.find({ category: category }) .sort({ title: 1 }) .exec(function (err, list_articles) { if (err) { return next(err); } res.render("search", { article_list: list_articles, current_category: category, }); }); };
优化点:
- 用
{ category: category }作为查询条件,直接从数据库获取对应分类的文章,减少数据传输量 - 参数名改为
category,语义更清晰
2. 修复EJS页面逻辑
修改search.ejs,调整判断逻辑避免重复提示,同时修复HTML标签错误:
<% if (article_list.length === 0) { %> <p>No Articles Match This Query</p> <% } else { %> <% article_list.forEach(function(article) { %> <div class="article"> <!-- 修复a标签闭合错误 --> <p class="title"> <a href="<%= article.url %>"><%= article.title %></a> </p> <p class="category"> <%= article.category %> </p> <p class="author"> written by: <%= article.author || 'Unknown' %> </p> </div> <% }); %> <% } %>
优化点:
- 先判断是否有匹配文章,无结果时仅显示一次提示
- 修复原代码中a标签闭合顺序错误的问题
- 给
author字段添加默认值,避免空值显示异常
3. 可选:路由语义化优化
将路由参数名从:id改为:category,让路由逻辑更清晰:
router.get("/article/search/:category", article_controller.search);
首页链接无需修改,参数值仍为tv/movies/music,仅参数名更符合语义。
内容的提问来源于stack exchange,提问作者Dagger
相关产品推荐
相关产品推荐

