Nodejs使用SQL模糊查詢的過程詳解
最近在改一個比較久的項目,是使用nodejs寫的,但是對于長期寫java的后端開發(fā)來說,還是有點難維護,不過不改bug的話,就需要重新開發(fā),所以只能慢慢看nodejs代碼,測試人員提了一個需要支持模糊查詢的bug,如果是java寫的,可以馬上改好,因為不熟悉nodejs代碼,還是改了一兩個小時,邊找資料,邊改,記錄下來,方便回顧
實驗環(huán)境
- 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 }) } ) }
運行后,發(fā)現(xiàn)報錯
{ "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" }
所以,修改一下,傳一個參數(shù)進去
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 }) } ) }
ok,經(jīng)過測試,可以查詢,不過測試,對于傳入"其%"這樣的查詢字符,sql是直接當成關鍵字“其”進行模糊查詢的,直接忽略了特殊符號“%”,所以要支持這種特殊符號查詢,可以加上轉義字符,暫時這樣處理
sql = `${sql} WHERE name LIKE ? ESCAPE '\\' ORDER BY t.modify_time DESC`; var queryWord = "%" + params.word.replace(/\\/g, "\\\\").replace(/%/g, "\\%") + "%";
到此這篇關于Nodejs使用SQL模糊查詢的過程詳解的文章就介紹到這了,更多相關Nodejs SQL模糊查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Node.js如何對SQLite的async/await封裝詳解
這篇文章主要給大家介紹了關于Node.js如何對SQLite的async/await進行封裝的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-02-02node.js 使用 net 模塊模擬 websocket 握手進行數(shù)據(jù)傳遞操作示例
這篇文章主要介紹了node.js 使用 net 模塊模擬 websocket 握手進行數(shù)據(jù)傳遞操作,結合實例形式分析了node.js基于net模塊模擬 websocket握手相關原理及進行數(shù)據(jù)傳遞具體操作技巧,需要的朋友可以參考下2020-02-02connect中間件session、cookie的使用方法分享
今天大象哥用了下connect的session和cookie,感覺還挺好用的,分享一下(里面坑挺多的,文檔寫的太模糊了,費了哥不少時間)。2014-06-06