基于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
相关产品推荐
相关产品推荐

