一切都始于一个错误
在 JavaScript 和 Node.js 中使用 URL 应该很简单,但是我们项目中最近的一个错误让我陷入了 URL 和 URLSearchParams API 中微妙怪癖的兔子洞。这篇文章将探讨这些怪癖,它们如何在您的代码中引起问题,以及您可以采取哪些措施来避免它们。
问题:使用 Axios 处理 URL
我们在生成 URL 并向其添加哈希签名时遇到了此问题。查询参数的百分比编码不一致,导致意外行为和错误的哈希签名。
很明显,URL 和 URLSearchParams 对象之间的交互需要格外小心。
陷阱#1:URL.search 与 URLSearchParams.toString()
第一个惊喜是 URL.search 和 URLSearchParams.toString() 之间的区别。
使用 .searchParams 修改 URL 时要小心,因为根据 WHATWG 规范,URLSearchParams 对象使用不同的规则来确定要对哪些字符进行百分比编码。例如,URL 对象不会对 ASCII 波形符 (~) 字符进行百分号编码,而 URLSearchParams 将始终对其进行编码。
// Example 1 const url = new URL("https://example.com?param=foo bar"); console.log(url.search); // prints param=foo%20bar console.log(url.searchParams.toString()); // prints ?param=foo+bar // Example 2 const myURL = new URL('https://example.org/abc?foo=~bar'); console.log(myURL.search); // prints ?foo=~bar // Modify the URL via searchParams... myURL.searchParams.sort(); console.log(myURL.search); // prints ?foo=%7Ebar
在我们的项目中,我们需要显式地重新分配 url.search = url.searchParams.toString() 以确保查询字符串的编码一致。
陷阱#2:加号困境
另一个问题是 URLSearchParams 如何处理字符。默认情况下,URLSearchParams 解释为空格,这在编码二进制数据或 Base64 字符串时可能会导致数据损坏。
const params = new URLSearchParams("bin=E+AXQB+A"); console.log(params.get("bin")); // "E AXQB A"
一种解决方案是在将值附加到 URLSearchParams 之前使用encodeURIComponent:
params.append("bin", encodeURIComponent("E+AXQB+A"));
更多详细信息请参阅 MDN 文档。
陷阱 #3:URLSearchParams.get 与 URLSearchParams.toString()
比较 URLSearchParams.get 和 URLSearchParams.toString 的输出时会出现另一个微妙之处。例如:
const params = new URLSearchParams("?key=value&key=other"); console.log(params.get("key")); // "value" (first occurrence) console.log(params.toString()); // "key=value&key=other" (all occurrences serialized)
在多值场景中,get 仅返回第一个值,而 toString 则序列化所有值。
我们代码库中的修复
在我们的项目中,我们通过显式重新分配搜索属性解决了该问题:
url.search = url.searchParams.toString(); url.searchParams.set( "hash", cryptography.createSha256HmacBase64UrlSafe(url.href, SECRET_KEY ?? "") );
这确保了在添加哈希值之前所有查询参数都已正确编码。
Node.js 查询字符串模块
WHATWG URLSearchParams 接口和 querystring 模块具有类似的用途,但 querystring 模块的用途更通用,因为它允许自定义分隔符(& 和 =)。另一方面,URLSearchParams API 纯粹是为 URL 查询字符串而设计的。
querystring 比 URLSearchParams 性能更高,但不是标准化 API。当性能不重要或需要与浏览器代码兼容时,请使用 URLSearchParams。
与 querystring 模块不同,使用 URLSearchParams 时,不允许数组值形式的重复键。数组使用 array.toString() 进行字符串化,它只是用逗号连接所有数组元素。
// Example 1 const url = new URL("https://example.com?param=foo bar"); console.log(url.search); // prints param=foo%20bar console.log(url.searchParams.toString()); // prints ?param=foo+bar // Example 2 const myURL = new URL('https://example.org/abc?foo=~bar'); console.log(myURL.search); // prints ?foo=~bar // Modify the URL via searchParams... myURL.searchParams.sort(); console.log(myURL.search); // prints ?foo=%7Ebar
使用querystring模块,查询字符串'foo=bar&abc=xyz&abc=123'被解析为:
const params = new URLSearchParams("bin=E+AXQB+A"); console.log(params.get("bin")); // "E AXQB A"
要点
小心 URLSearchParams 处理特殊字符(例如 ~)和空格。必要时使用encodeURIComponent。
了解 URL.search、URLSearchParams.get 和 URLSearchParams.toString 之间的区别,以避免意外行为。
在 Node.js 中,如果要将重复的查询参数键解析为数组,请使用查询字符串模块。
以上是JavaScript 中 URL 和 URLSearchParams 的陷阱的详细内容。更多信息请关注PHP中文网其他相关文章!

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境