Node.js 中的 URL 模块
一、URL 模块基础
1. 模块导入方式
// Node.js 方式
const url = require('url');// ES 模块方式 (Node.js 14+ 或启用 ESM)
import * as url from 'url';
2. 核心功能
-
解析 URL 字符串
-
格式化 URL 对象
-
URL 处理工具方法
-
WHATWG URL 标准实现
二、URL 解析与构建
1. 传统解析方法 (Legacy API)
const urlObj = url.parse('https://example.com:8080/p/a/t/h?query=string#hash');// 解析结果示例
{protocol: 'https:',slashes: true,auth: null,host: 'example.com:8080',port: '8080',hostname: 'example.com',hash: '#hash',search: '?query=string',query: 'query=string',pathname: '/p/a/t/h',path: '/p/a/t/h?query=string',href: 'https://example.com:8080/p/a/t/h?query=string#hash'
}
参数解析模式
const urlObj = url.parse('https://example.com?foo=bar&abc=xyz', true);
// urlObj.query 结果为 { foo: 'bar', abc: 'xyz' }
2. WHATWG URL API (推荐)
const myURL = new URL('https://example.com:8080/p/a/t/h?query=string#hash');// URL 对象属性
console.log(myURL.href); // 完整URL
console.log(myURL.protocol); // 'https:'
console.log(myURL.hostname); // 'example.com'
console.log(myURL.port); // '8080'
console.log(myURL.pathname); // '/p/a/t/h'
console.log(myURL.search); // '?query=string'
console.log(myURL.hash); // '#hash'
console.log(myURL.origin); // 'https://example.com:8080'
查询参数处理
const myURL = new URL('https://example.com/?user=abc&query=xyz');// 获取查询参数
console.log(myURL.searchParams.get('user')); // 'abc'// 设置查询参数
myURL.searchParams.set('page', '1');
console.log(myURL.href);
// 'https://example.com/?user=abc&query=xyz&page=1'// 遍历参数
myURL.searchParams.forEach((value, name) => {console.log(`${name}: ${value}`);
});
三、URL 格式化与操作
1. 格式化 URL 对象
// 传统方式
const formattedUrl = url.format({protocol: 'https',hostname: 'example.com',pathname: '/some/path',query: { page: 1, limit: 10 }
});
// 'https://example.com/some/path?page=1&limit=10'// WHATWG 方式
const myURL = new URL('https://example.com');
myURL.pathname = '/new/path';
myURL.search = '?filter=latest';
console.log(myURL.href);
// 'https://example.com/new/path?filter=latest'
2. URL 拼接
// 传统方式
const resolvedUrl = url.resolve('https://example.com/foo/bar', '../baz');
// 'https://example.com/baz'// WHATWG 方式
const baseUrl = new URL('https://example.com/foo/bar');
const newUrl = new URL('../baz', baseUrl);
console.log(newUrl.href);
// 'https://example.com/baz'
四、URLSearchParams 类
1. 基本用法
const params = new URLSearchParams('key1=value1&key2=value2');// 添加参数
params.append('key3', 'value3');// 获取参数
console.log(params.get('key1')); // 'value1'// 检查存在
console.log(params.has('key2')); // true// 删除参数
params.delete('key2');// 转换为字符串
console.log(params.toString()); // 'key1=value1&key3=value3'
2. 高级操作
const params = new URLSearchParams([['user', 'abc'],['query', 'first'],['query', 'second']
]);// 获取所有值
console.log(params.getAll('query')); // ['first', 'second']// 迭代参数
for (const [name, value] of params) {console.log(`${name}: ${value}`);
}// 排序参数
params.sort();
五、实际应用场景
1. Web 服务器路由解析
const http = require('http');
const url = require('url');http.createServer((req, res) => {const parsedUrl = url.parse(req.url, true);// 获取路径和查询参数const pathname = parsedUrl.pathname;const query = parsedUrl.query;if (pathname === '/search' && query.q) {// 处理搜索请求}
}).listen(3000);
2. 构建 API 端点
function buildApiUrl(base, endpoint, params) {const apiUrl = new URL(endpoint, base);Object.entries(params).forEach(([key, value]) => {apiUrl.searchParams.append(key, value);});return apiUrl.href;
}const url = buildApiUrl('https://api.example.com', '/v1/products', {category: 'electronics',page: 2,limit: 20
});
3. 安全重定向验证
function safeRedirect(baseUrl, redirectPath) {try {const redirectUrl = new URL(redirectPath, baseUrl);// 验证是否同源if (redirectUrl.origin === new URL(baseUrl).origin) {return redirectUrl.href;}return baseUrl;} catch (e) {return baseUrl;}
}
六、注意事项与最佳实践
1. 安全性考虑
-
始终验证用户提供的 URL
-
处理 URL 解析错误
-
警惕协议跳转 (http → https)
-
注意编码问题 (防止 XSS)
2. 性能建议
-
重用 URL 和 URLSearchParams 对象
-
避免频繁解析相同 URL
-
对大量参数使用 URLSearchParams 而不是字符串操作
3. 兼容性说明
-
传统 API (
url.parse()
) 已弃用但仍在维护 -
WHATWG URL API 是现代标准实现
-
Node.js 10+ 完全支持 WHATWG URL
七、常见问题解决方案
1. 处理特殊字符
const myURL = new URL('https://example.com');
myURL.searchParams.set('query', 'some value with spaces');
console.log(myURL.href);
// 'https://example.com/?query=some+value+with+spaces'
2. 获取不带查询的路径
const myURL = new URL('https://example.com/path?query=string');
console.log(myURL.pathname + myURL.hash); // '/path'
3. 比较 URL
function areUrlsEqual(url1, url2) {try {return new URL(url1).href === new URL(url2).href;} catch (e) {return false;}
}
URL 模块是 Node.js 中处理 Web 地址的核心工具,熟练掌握可以高效解决各种 URL 操作需求。WHATWG URL API 提供了更现代、更符合标准的实现方式,推荐在新项目中使用。
相关文章:
Node.js 中的 URL 模块
一、URL 模块基础 1. 模块导入方式 // Node.js 方式 const url require(url);// ES 模块方式 (Node.js 14 或启用 ESM) import * as url from url; 2. 核心功能 解析 URL 字符串 格式化 URL 对象 URL 处理工具方法 WHATWG URL 标准实现 二、URL 解析与构建 1. 传统解…...
JavaWeb 前端开发
JavaWeb前端 初识 HTMLCSS 入门程序 什么是HTML HTML是由标签构成的 什么是CSS HTML快速入门 标签可以是大写,也可以是小写,也可以是大小写混用。 属性值也可以使用单引号,但一般使用双引号。 HTML的语法结构比较松散,不严谨…...
设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析
目录 一、策略模式:AI大模型的动态决策引擎 1.1 核心原理与工业级实现 1.2 AI时代的技术演进 二、模板方法模式:AI流水线的标准化基石 2.1 多模态处理框架设计 三、策略与模板方法的协同创新 3.1 电商推荐系统实践 四、前沿趋势与挑战 4.1 量子计算增强模式 五、伦理…...
2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局
2. 盒模型/布局模块 - 响应式产品展示页 案例:电商产品网格布局 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">:root {--primary-color…...
H5S 视频监控AWS S3 对象存储
本文介绍一下如何使用S3对象存储作为H5S 存储空间进行录像存储 然后创建一个对象存储,本文以minio 为例(实际项目亲测天翼云): 首先安装 s3fs 如果是redhat系列,使用如下命令 sudo yum install epel-release sudo yum install s3fs-fuse …...
Visual Studio 2022 跨网络远程调试
🚀 Visual Studio 2022 跨网络远程调试实践指南 在本地开发软件时,Visual Studio 的调试器是我们最依赖的工具之一。但是当目标程序运行在远程设备上,例如测试服务器、工控设备或嵌入式终端,如何实现 跨网络远程调试 成为了开发中…...
最短路与拓扑(1)
1、找最长良序字符串 #include<bits/stdc.h> using namespace std; const int N105; int dis[N]; int vis[N]; int edge[N][N]; int n,m; int vnum;void dij(int u, int v) {// 初始化距离数组和访问标记for(int i0; i<vnum; i) {vis[i] 0;dis[i] edge[u][i];}// D…...
【前缀和】和为 K 的子数组(medium)
【前缀和】和为 K 的子数组 题目描述算法原理和细节问题代码 题目描述 和为 K 的子数组 给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。 示例 1: 输入:nums [1,1,1], k 2 输出: 2 解释: 此题 [1,1] 与 [1,1] 为两种不同的…...
深入理解 JVM:StackOverFlow、OOM 与 GC overhead limit exceeded 的本质剖析及 Stack 与 Heap 的差异
摘要 在 Java 开发过程中,内存管理相关的问题一直是开发者需要重点关注的领域。StackOverFlow、OutOfMemory(OOM)和GC overhead limit exceeded是常见的运行时错误,而理解Stack(栈)和Heap(堆&a…...
汽车功能安全--TC3xx MBIST设计要点
英飞凌针对硬件潜伏故障的自测,提供了四种机制:PBIST、LBIST、MONBIST和MBIST。 LBIST和MONBIST我们已经聊过了,今天就快速介绍下MBIST。 MBIST,全程Memory Built-in Self Test,用于检测SRAM数据单元的完整性。 在2…...
blazor与硬件通信实现案例
在网页接入硬件交互通信方案这篇博客中,曾经提到了网页中接入各种硬件操作的方法,即通过Windows Service作为指令的中转,并建立websocket通信连接,进而实现接入硬件的各种操作。这篇博客就以实际的案例来讲解具体怎么实现。 一、建立Windows Service项目 比如我就建立了一…...
思迈特软件携手天阳科技,打造ChatBI金融智能分析新标杆
5月10日,广州思迈特软件有限公司(以下简称“思迈特软件”)与天阳宏业科技股份有限公司(以下简称“天阳科技”)在北京正式签署战略合作协议。思迈特软件董事长吴华夫、CEO姚诗成,天阳科技董事长兼总裁欧阳建…...
微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
在上一篇中,我们理解了微服务架构的核心理念以及Spring Cloud为我们提供的强大工具集。我们提到,微服务架构的一个核心挑战在于,服务实例的网络位置是动态的,服务之间需要一种机制来互相定位。 想象一下,你开了一家新…...
Linux之初见进程
1. 冯诺依曼体系结构 冯诺依曼体系结构是计算机的基本设计原则之一,也被认为是现代计算机的基础。它由美国数学家约翰冯诺伊曼在20世纪40年代后期提出。冯诺依曼体系结构包括存储程序概念、将数据和指令存储在同一存储器中、按照顺序执行指令等关键特征。 具体来说…...
Docker入门教程:常用命令与基础概念
目录 简介常用命令Docker 常用命令汇总docker run 命令格式与参数解析 简介 Docker 是一个客户端-服务器(client-server)架构的应用程序,其中包含两个主要组件:Docker 客户端和 Docker 守护进程(也称为 Docker Daemon…...
内核深入学习3——分析ARM32和ARM64体系架构下的Linux内存区域示意图与页表的建立流程
内核深入学习3——ARM32/ARM64在Linux内核中的实现(2) 今天我们来讨论的是一个硬核的内容,也是一个老生常谈的话题——那就是分析ARM32和ARM64体系架构下的Linux内存区域示意图的内容。对于ARM64的部分,我们早就知道一个基本的…...
vim 练习题
文章目录 前言:学习了vim基础命令,上机实操下吧命令模式练习插入模式练习末行模式练习视图模式练习高级操作练习 总结 前言:学习了vim基础命令,上机实操下吧 命令模式练习 打开任意文本文件,使用gg跳转到首行&#x…...
CSS3 选择器完全指南:从基础到高级的元素定位技术
CSS3选择器完全指南:从基础到高级的元素定位技术 一、基本选择器:精准定位的基石 (一)元素选择器 通过元素标签名直接匹配页面元素,语法简洁直观: p { color: #333; } /* 选择所有<p>元素 */ div…...
从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation Promptable Segmentation
SAM的火爆也带来了一项新的任务:Promptable Segmentation,并且作者在文中对比了交互式分割Interactive Segmentation,并且在训练过程中也参考了交互式分割的训练方法,那么可提示分割与交互式分割有什么区别? 个人观点…...
k8s初始化时候,报错无法通过 CRI(容器运行时接口)与 containerd 通信
报错主要信息处 [reset] Unmounting mounted directories in “/var/lib/kubelet” W0513 11:34:19.818023 27124 cleanupnode.go:134] [reset] Failed to evaluate the “/var/lib/kubelet” directory. Skipping its unmount and cleanup: lstat /var/lib/kubelet: no such f…...
k8s之k8s集群部署
一、kubernetes基础环境搭建 1.安装虚拟机 2. 基础环境配置 2.1 关闭防火墙 更改主机名 #系统更新 sudo dnf update -y # 关闭防火墙 sudo systemctl stop firewalld sudo systemctl disable firewalld # 临时关闭 SELinux sudo setenforce 0 # 永久关闭 SELinux sudo sed -i…...
百度智能云千帆携手联想,共创MCP生态宇宙
5月7日,2025联想创新科技大会(Tech World)在上海世博中心举行,本届大会以“让AI成为创新生产力”为主题。会上,联想集团董事长兼CEO杨元庆展示了包括覆盖全场景的超级智能体矩阵,包括个人超级智能体、企业超…...
黑白浮生项目测试报告
文章目录 一、项目背景二、项目功能三、测试计划1. 功能测试1.1 注册页面1.1.1 正常注册1.1.2 异常注册 1.2 登录页面1.2.1 正常登录1.2.2 异常登录 1.3 游戏大厅页面1.3.1 开始匹配1.3.2 取消匹配 1.4 游戏房间页面1.4.1 落子1.4.2 游戏结束 2. 自动化测试2.1 创建浏览器驱动类…...
《操作系统真象还原》第十四章(2)——文件描述符、文件操作基础函数
文章目录 前言文件描述符简介文件描述符原理文件描述符实现修改thread.h修改thread.c 文件操作相关的基础函数inode操作相关函数文件相关函数编写file.h编写file.c 目录相关函数完善fs/dir.h编写fs/dir.c 路径解析相关函数实现文件检索功能修改fs.h继续完善fs.c makefile 结语 …...
k8s v1.26 实战csi-nfs 部署
一 前言 使用自开发的一键k8s基础环境部署后,存储需要解决,就是测试环境故选择nfs比较简单,翻阅很多网上资料感觉都不是很全面,结合网上资料折腾了一天,总算是完成了csi-nfs部署。其实之前也部署过,经过一…...
测试集群的功能-执行wordcount程序
具体的操作步骤如下: 确保hadoop是正确运行的。hdfs和yarn都正常启动了。在集群根目录下创建wcinput目录,并在它的下面上传两个文本文件word1.txt, word2.txt,其中保存了要测试的单词信息。在任意一台设备中,进入到hadoop的主目录…...
聊一聊Electron中Chromium多进程架构
Chromium 多进程架构概述 Chromium 的多进程架构是其核心设计之一,旨在提高浏览器的稳定性、安全性和性能。Chromium 将不同的功能模块分配到独立的进程中,每个进程相互隔离,避免了单进程架构中一个模块的崩溃导致整个浏览器崩溃的问题。 在…...
虹科技术 | 简化汽车零部件测试:LIN/CAN总线设备的按键触发功能实现
汽车零部件测试领域对操作的便捷性要求越来越高,虹科Baby-LIN-RC系列产品为这一需求提供了完美的解决方案。从基础的按键设置到高级的Shift键应用,本文将一步步引导您了解虹科Baby-LIN-RC系列产品的智能控制之道。 虹科Baby-LIN-3-RC 想象一下࿰…...
前端开发避坑指南:React 代理配置常见问题与解决方案
前端开发避坑指南:React 代理配置常见问题与解决方案 一、为什么需要配置代理?二、使用 create-react-app 默认配置代理三、使用 http-proxy-middleware 配置复杂代理四、高级代理配置五、生产环境中的代理配置一、为什么需要配置代理? React 应用在开发过程中经常需要与后端…...
43、Server.UrlEncode、HttpUtility.UrlDecode的区别?
Server.UrlEncode 和 HttpUtility.UrlDecode 是 .NET 中用于处理 URL 编码/解码的两个不同方法,主要区别在于所属命名空间、使用场景和具体行为。以下是详细对比: 1. 所属类库与命名空间 Server.UrlEncode 属于 System.Web.HttpServerUtility 类。通常…...
Azure 应用的托管身份与服务主体
Microsoft Entra ID -- 前称 Azure Active Directory -- 提供强大的身份验证和授权功能。托管身份和服务主体通过限制凭据暴露的风险来帮助确保对 Azure 资源的访问安全。 托管身份为Azure原生应用程序自动管理身份,而服务主体则非常适合需要访问Azure资源的外部应…...
音频特征工具Librosa包的使用
深入探索Mamba模型架构与应用 - 商品搜索 - 京东 DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 要使用深度学习与语音特征进行抽取,首先需要准备能够对语音特征进行解析的工具。 Librosa是一个用于音频、音乐分析与处理的Python工具包&#x…...
Mapreduce初使用
(一)MapReduce的定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个…...
Samtec助力电视广播行业
【摘要前言】 现代广播电视技术最有趣的方面之一就是界限的模糊。过去,音频和视频是通过射频电缆传输的模拟技术采集的,而现在,数字世界已经取代了模拟技术。物理胶片和磁带已让位于数字存储设备和流媒体。 在这个过程中,连接器…...
根据输入的数据渲染柱形图
背景:根据不同季度的销售额,生成对应的柱形图,直观的看出差异 效果: 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatibl…...
Three.js模型材质调整与性能优化实战
一、材质基础调整 1.1 颜色与透明度控制 通过Material.color属性可直接修改材质颜色: material.color new THREE.Color(0xff0000); // 红色结合opacity属性实现透明效果: material.opacity 0.5; // 50%透明度如需动态调整,可通过Color.…...
QEMU模拟32位ARM实现自定义系统调用
实现自定义系统调用 如何使用 QEMU 模拟32位 ARM 环境参考:使用Qemu模拟32位ARM系统 修改linux内核源码 使用 linux-4.4.240 源码,下载链接:下载链接 在 arch\arm\include\uapi\asm\unistd.h 文件下新增系统调用 sys_test: /…...
AWS IoT Core自定义域名配置实战指南
在使用AWS IoT Core时,配置自定义域名可以为您的IoT解决方案带来多方面的好处。本文将详细介绍如何在AWS IoT Core中设置和使用自定义域名,包括证书配置、域名设置以及DNS记录创建等关键步骤。 为什么要使用自定义域名? 使用自定义域名(也称为客户管理的域名)有以下几个主要…...
【C盘空间不足怎么办】
C 盘空间不足是一个常见的问题,即使感觉没怎么用,也可能被各种文件悄悄占满。这里分析一下常见的原因和排查方向: 一、 常见的空间占用大户: Windows 系统文件和更新: Windows Update 缓存: 系统更新后&am…...
workman进阶应用 GatewayWorker 仿微信 做聊天室
聊天室主要用到GatewayWorker ,它是对workerman的进一步封装 GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、物联网、智能家居等等。 1. 安装环境 1.1 首先下载框架 compos…...
WebRTC技术EasyRTC嵌入式音视频通信SDK打造远程实时视频通话监控巡检解决方案
一、方案概述 在现代工业生产、基础设施维护等领域,远程监控与巡检工作至关重要。传统的监控与巡检方式存在效率低、成本高、实时性差等问题。EasyRTC作为一种先进的实时音视频通信技术,具备低延迟、高稳定性、跨平台等特性,能够有效解决这…...
window 显示驱动开发-创建分配时指定段
显示微型端口驱动程序指定并返回有关其内存段的信息,当视频内存管理器调用驱动程序的 DxgkDdiCreateAllocation 函数时,它更喜欢视频内存管理器使用这些信息。 在调用 DxgkDdiCreateAllocation 时,驱动程序为视频资源创建分配。 驱动程序在描…...
如何创建企业微信应用,如何给企业微信发送消息
首先打开你的企业微信 然后在下面创建应用 我创建的是 pes 设置域名和白名单 等你要开发的时候 就需要配置了 然后就能直接在本地发送企业微信消息了 切记 要配置白名单ip 如果要获取所有部门信息,旧得接口已经不能用了,只能获取所有部门id 前提是…...
WM_TIMER定时器消息优先级低,可能会被系统丢弃,导致定时任务无法正常执行
之前在优化电子白板绘制曲线功能时就遇到WM_TIMER定时器消息被丢弃的问题。原先在绘制曲线图元时,左键按下后一直不放,拖动鼠标绘制曲线(不断绘制一些小线段形成曲线),等到左键弹起后完成一个完整曲线的绘制࿰…...
在Babylon.js中实现完美截图的艺术:包含Canvas和HTML覆盖层
在现代Web 3D应用开发中,Babylon.js作为强大的3D引擎被广泛应用。一个常见的需求是实现场景截图功能,特别是当场景中包含HTML覆盖层(如UI控件、菜单等)时。本文将深入探讨如何在Babylon.js中实现完整的截图方案。 问题背景 这里我是希望实现一个渐隐的…...
mac 10.15.7 svn安装
macOS 版本推荐 SVN 安装方式≤10.14Homebrew 安装独立 SVN≥10.15优先使用 CLT 自带 SVN 一、使用 brew 安装 (没成功) brew install subversion 这个方法安装一直不成功,一直在提示说版本旧或都是一些引用工具安装失败, 二、使…...
文件同步2
请大家思考如何使用scp命令去解决这个问题。 有两种思路: 第一种:三个文件一个一个去拷贝。缺点是操作麻烦,要逐一操作。 第二种:重新把A上的conf拷贝到B上。缺点是会重复拷贝文件1,2,3,4。 …...
el-select 结合 el-tree:树形下拉数据
一、单选 <template><div class"selectTree-wapper"><el-selectv-model"selectValue"placeholder"请选择"popper-class"custom-el-select-class"ref"selectRef"clearableclear"clearHandle">&…...
GOOSE 协议中MAC配置
在 GOOSE(Generic Object Oriented Substation Event)协议中,主站(Publisher)发送的 MAC 地址不需要与从站(Listener)的 MAC 地址一致,其通信机制与 MAC 地址的匹配逻辑取决于 GOOSE…...
11. CSS从基础样式到盒模型与形状绘制
在前端开发中,CSS(层叠样式表)是控制网页样式和布局的核心技术。整理了关于 CSS 基础样式、文本样式、盒模型以及形状绘制的一些心得。以下是详细的学习笔记。 一、基础样式设置 1. 字体样式 字体样式是网页视觉呈现的重要组成部分…...