如何编写Express代码实现MySQL数据库商品名称模糊查询?
解决MySQL模糊匹配商品的问题
你当前代码的核心问题是使用了精确匹配的=操作符,这只会返回名称和输入完全一致的商品。要实现“包含指定字符”的模糊查询,需要改用MySQL的LIKE操作符配合通配符%。
修改后的代码示例
app.get('/models/:name', (req, res, next) => { const connection = getConnection(); // 使用LIKE和通配符%,%表示任意长度的任意字符 const queryStr = 'SELECT * FROM products WHERE name LIKE ?'; const modelName = `%${req.params.name}%`; // 给参数前后加上%,实现包含匹配 connection.query(queryStr, [modelName], (err, rows, fields) => { if (err) { // 统一错误响应,避免多次send导致的问题 return res.status(500).send('<h1>500 Server Error</h1> Sorry for the inconvenience, we are fixing it!'); } console.log('Query executed successfully'); res.json(rows); }); });
关键修改点说明
- SQL语句调整:把
name=?改成name LIKE ?,LIKE是MySQL专门用于模糊匹配的操作符。 - 通配符使用:
%是通配符,%samsung%表示匹配任何包含samsung的字符串(不管前后有什么字符)。如果只需要前缀匹配可以用samsung%,后缀匹配用%samsung。 - 错误处理优化:原代码中
res.send后又调用res.sendStatus会导致响应重复发送,改用res.status(500).send()一次性设置状态码和响应内容,并且用return终止后续代码执行。 - 安全性:保持使用参数化查询(把
modelName放在数组里传给query方法),避免直接拼接SQL字符串导致的SQL注入风险。
额外提示
如果你的商品名称区分大小写,可以在查询里加上LOWER()函数统一大小写,比如:
SELECT * FROM products WHERE LOWER(name) LIKE LOWER(?)
这样用户输入samsung或者Samsung都会返回相同的结果。
内容的提问来源于stack exchange,提问作者user8283671
相关产品推荐
相关产品推荐

