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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:13:10