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

如何在Node、Express、EJS中保留搜索参数并追加分类筛选URL?

解决方案

1. 动态生成带参数的分类链接(EJS模板修改)

把原来的静态分类链接改成动态拼接当前URL中的search_string参数,确保搜索状态下点击分类时不会丢失关键词。

假设后端已将search_string变量传入EJS模板,修改单条分类链接如下:

<% if (search_string) { %>
  <a href="/search?search_string=<%= encodeURIComponent(search_string) %>&category=xxx">Category</a>
<% } else { %>
  <a href="/category?category=xxx">Category</a>
<% } %>

如果有多个分类,建议循环渲染分类列表,用URL对象安全拼接参数(避免手动编码出错):

<% categories.forEach(category => { %>
  <% const url = new URL('/search', 'http://localhost:1337');
     if (search_string) url.searchParams.append('search_string', search_string);
     url.searchParams.append('category', category.id); %>
  <a href="<%= url.toString() %>"><%= category.name %></a>
<% }) %>

2. 统一后端路由逻辑,支持多参数组合查询

原来的/search和/category路由是独立处理的,现在需要让它们同时支持search_string和category参数,实现组合筛选。

以Express为例,修改路由代码:

// 合并搜索与筛选逻辑,处理所有参数组合
app.get('/search', (req, res) => {
  const { search_string, category } = req.query;
  let queryCondition = {};

  // 添加搜索模糊匹配条件(假设按产品名称搜索)
  if (search_string) {
    queryCondition.name = { $regex: search_string, $options: 'i' };
  }

  // 添加分类筛选条件
  if (category) {
    queryCondition.category = category;
  }

  // 查询数据库并渲染页面
  Product.find(queryCondition)
    .then(products => {
      res.render('products', {
        products,
        search_string: search_string || '',
        categories: [] // 传入分类列表用于渲染链接
      });
    })
    .catch(err => console.error(err));
});

// 兼容原有/category路由,有搜索参数时重定向到/search路由
app.get('/category', (req, res) => {
  const { category, search_string } = req.query;
  if (search_string) {
    res.redirect(`/search?search_string=${encodeURIComponent(search_string)}&category=${category}`);
  } else {
    Product.find({ category })
      .then(products => {
        res.render('products', { products, search_string: '', categories: [] });
      })
      .catch(err => console.error(err));
  }
});

3. 首页渲染时传入空的search_string

首页展示全部产品时,渲染模板要传入search_string: '',确保分类链接生成正确的无搜索参数URL:

app.get('/', (req, res) => {
  Product.find({})
    .then(products => {
      res.render('products', {
        products,
        search_string: '',
        categories: []
      });
    })
    .catch(err => console.error(err));
});

这样就能实现:

  • 无搜索状态下,点击分类直接筛选全部产品中的对应分类
  • 搜索后点击分类,会保留搜索关键词并追加分类参数,URL变为/search?search_string=abc&category=xxx

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:18:28