本文详细记录了在 Node.js 项目中实现 SQL 模糊查询的过程,重点解决了直接使用字符串拼接导致的语法错误。通过采用参数化查询传递变量,并针对包含通配符 '%' 和 '_' 的用户输入进行手动转义,实现了支持特殊符号的精确模糊匹配。
近期在维护一个基于 Node.js 开发的旧项目,对于长期从事 Java 后端开发的工程师而言,这类代码的维护具有一定挑战性。虽然不修复 Bug 可能意味着需要重构,但为了应对测试人员提出的模糊查询功能需求,只能逐步梳理 Node.js 代码。经过约两小时的资料查阅与调试,最终完成了功能修改,特此记录以便后续回顾。
实验环境
- 开发工具:VS Code

- 数据库版本:MySQL 8.0.26
修改过程
初始尝试直接进行代码修改。
exports.queryWordsList = function (req, res, next) {
var Words = DB.get('Words')
var params = req.body
var page = new Page({
pageNum: params.pageNum || 1,
pageSize: params.pageSize || 10,
})
delete params.pageNum
delete params.pageSize
var sql = `select t.id,t.name,t.words, t.type,t.tip_msg,t.replace_str,t.desc,
UNIX_TIMESTAMP(t.create_time)*1000 as create_time,
UNIX_TIMESTAMP(t.modify_time)*1000 as modify_time
from t_words t`
if (params.word) {
sql = `${sql} WHERE name like '%?%' order by t.modify_time desc`
} else {
sql = `${sql} order by t.modify_time desc`
}
Words.queryPageBySql(sql,page,[params.word],function (err, result) {
if (err) {
res.json({ rescode: '10001', err: err })
return
}
var list = page.list
res.json({ rescode: '10000', data: result })
}
)
}
运行后发现程序报错。
{
"rescode": "10001",
"err": {
"code": "ER_PARSE_ERROR",
"errno": 1064,
"sqlMessage": "You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near '其'%' order by t.modify_time desc ) T' at line 4",
"sqlState": "42000",
"index": 0,
"sql": "select count(*) as count from ( select t.id,t.name,t.type,t.tip_msg,t.replace_str,t.desc,\n UNIX_TIMESTAMP(t.create_time)*1000 as create_time,\n UNIX_TIMESTAMP(t.modify_time)*1000 as modify_time\n from t_words t WHERE name like '%'其'%' order by t.modify_time desc ) T"
},
"status": false,
"req_id": "1713148803682.74"
}
因此调整方案,改为通过参数传递查询条件。
exports.queryWordsList = function (req, res, next) {
var Words = DB.get('Words')
var params = req.body
var page = new Page({
pageNum: params.pageNum || 1,
pageSize: params.pageSize || 10,
})
delete params.pageNum
delete params.pageSize
var sql = `select t.id,t.name,t.type,t.tip_msg,t.replace_str,t.desc,
UNIX_TIMESTAMP(t.create_time)*1000 as create_time,
UNIX_TIMESTAMP(t.modify_time)*1000 as modify_time
from t_words t`
if (params.word) {
sql = `${sql} WHERE name like ? order by t.modify_time desc`
} else {
sql = `${sql} order by t.modify_time desc`
}
var queryWord = "%" + params.word + "%";
Words.queryPageBySql(sql,page,[queryWord],function (err, result) {
if (err) {
res.json({ rescode: '10001', err: err })
return
}
var list = page.list
res.json({ rescode: '10000', data: result })
}
)
}
测试确认可以正常执行查询,但发现当传入如“其%”这类包含通配符的字符串时,SQL 语句直接将其中的 '%' 视为关键字处理,导致特殊符号被忽略。为解决此问题,需引入转义字符机制,暂时采用以下处理方式。
sql = `${sql} WHERE name LIKE ? ESCAPE '\\' ORDER BY t.modify_time DESC`;
var queryWord = "%" + params.word.replace(/\\/g, "\\\\").replace(/%/g, "\\%") + "%";
至此,关于 Node.js 实现 SQL 模糊查询的详细过程介绍完毕。如需了解更多 Node.js 与 SQL 模糊查询相关内容,建议查阅本站往期文章或继续浏览后续教程,感谢大家的支持。