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

基于Node.js+Express MVC架构的客户搜索栏功能故障排查求助

问题分析与解决方法

咱们先把几个核心错误找出来,逐个修正:

1. 路由配置错误

你当前的路由写法:

router.get('/customer?search',authentication.handleAuthentication, authadmin.authAdmin,adminController.searchCustomer);

这是不对的——Express的路由路径只匹配URL的路径部分,?search=xxx属于查询参数,不需要写在路由路径里。正确的路由应该是:

router.get('/customer', authentication.handleAuthentication, authadmin.authAdmin, adminController.searchCustomer);

这样不管URL有没有search参数,都会触发这个路由处理函数。

2. GET参数获取方式错误

GET请求的查询参数(就是URL里?后面的部分)是存在req.query对象里的,不是req.params(这是路由路径参数,比如/customer/:id里的id),也不是req.body(这是POST/PUT等请求的请求体数据)。

所以你的searchCustomer控制器应该改成:

let searchCustomer = async (req,res,next) =>{
  // 获取搜索关键词,处理空值情况
  let name = req.query.search || '';
  let customer = await adminServices.getCustomerByName(name);
  // 把搜索词也传给模板,方便回显
  return res.render('admin/customer.ejs', { 
    customer: customer,
    searchKeyword: name
  });
}

3. 数据库查询是精确匹配,不是模糊匹配

你当前的查询await db.User.find({ fullname: name });是精确匹配fullname字段,而需求是查找包含输入字符串的客户,所以需要用模糊查询:

  • 如果是用MongoDB/Mongoose(从你的代码写法看更像),用$regex实现模糊匹配,还可以加i选项忽略大小写:
let getCustomerByName = (name) => {
  return new Promise(async (resolve, reject) => {
    try {
      // 如果name为空,返回所有客户;否则模糊匹配
      let query = name ? { fullname: { $regex: name, $options: 'i' } } : {};
      let users = await db.User.find(query);
      console.log(users);
      resolve(users);
    } catch (e) {
      reject(e);
    }
  });
};
  • 如果你确实是用MySQL(你开头提到的),那应该用LIKE语句,比如用mysql2等库的话:
let getCustomerByName = (name) => {
  return new Promise((resolve, reject) => {
    try {
      let query = name 
        ? 'SELECT * FROM users WHERE fullname LIKE ?'
        : 'SELECT * FROM users';
      let params = name ? [`%${name}%`] : [];
      db.query(query, params, (err, results) => {
        if (err) reject(err);
        console.log(results);
        resolve(results);
      });
    } catch (e) {
      reject(e);
    }
  });
};

4. 表单搜索词回显问题

你的input标签value="<%= %>"是空的,提交搜索后搜索框会清空,体验不好。改成用模板变量回显搜索词:

<form class="d-flex" method="GET">
  <input class="form-control me-2 py-1" type="text" id="search" name="search" placeholder="Search customer name" aria-label="Search" value="<%= searchKeyword || '' %>" />
  <button class="btn btn-sm btn-secondary" type="submit">Search</button>
</form>

这里的searchKeyword就是咱们在控制器里传给模板的变量。

最后验证

修改完这些后,再访问http://localhost:8080/customer?search=mai,控制台应该会输出匹配的客户数据,页面也能正确渲染结果了。如果还是有问题,可以在控制器里先打印req.query看看是否能拿到参数,一步步排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:22:28