You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:47:26