Express查询解析:JS Fetch含%字符的URL编码问题求解
嘿,这个问题我之前做项目的时候也踩过坑!咱们来一步步拆解解决:
问题根源
你遇到的是HTTP URL的编码机制导致的——当你直接把包含%、空格这类特殊字符的SQL查询拼接到URL里时,浏览器(包括fetch API)会自动对URL进行百分号编码:%会被转成%25,空格转成%20,最终传到后端的就是编码后的字符串,直接丢给SQLite执行肯定会出错。
两种可行的解决方案
方案1:后端解码(快速治标)
如果后端服务是你能控制的,最简单的办法就是在拿到URL里的SQL查询后,先用解码函数把它转成原始字符串,再传给SQLite。比如在Node.js后端里可以这么做:
// 假设从URL中拿到的编码后的查询是encodedQuery const originalQuery = decodeURIComponent(encodedQuery); // 再用originalQuery去执行SQLite操作
这样不管前端传过来的是SELECT%20*%20FROM%20table%20WHERE%20col%20LIKE%20%25test%25,解码后都会变回SELECT * FROM table WHERE col LIKE '%test%',就能正常执行了。
方案2:改用POST传查询(更规范治本)
其实把SQL查询放在URL里本身就不太合适——不仅有编码问题,还存在URL长度限制,更重要的是容易暴露敏感操作,增加SQL注入风险。更好的做法是把查询放在请求体里,用POST方法发送:
// 假设你的原始SQL查询存在sqlQuery变量里 fetch(`/api/isos/${this.iso}/` + endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ sqlQuery: sqlQuery }) }) .then((response) => response.json()) .then((json) => { if(json.error) this.error = json; else this[dataName] = json; this.running = false; });
后端只需要从请求体里读取sqlQuery字段,直接用这个原始字符串执行SQL操作就行,完全绕开了URL编码的问题。
⚠️ 重要提醒:不管用哪种方式,都一定要注意SQL注入风险!绝对不要直接把用户输入的内容拼接到SQL语句里,一定要用SQLite的参数化查询(比如db.run("SELECT * FROM table WHERE col LIKE ?", [userInput]))来避免安全问题。
内容的提问来源于stack exchange,提问作者Sammy

