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. 传统解…...
Java集合框架详解与使用场景示例
Java集合框架是Java标准库中一组用于存储和操作数据的接口和类。它提供了多种数据结构,每种数据结构都有其特定的用途和性能特点。在本文中,我们将详细介绍Java集合框架的主要组成部分:List、Set和Queue,并通过代码示例展示它们的…...

Ensemble Alignment Subspace Adaptation Method for Cross-Scene Classification
用于跨场景分类的集成对齐子空间自适应方法 摘要:本文提出了一种用于跨场景分类的集成对齐子空间自适应(EASA)方法,它可以解决同谱异物和异谱同物的问题。该算法将集成学习的思想与域自适应(DA)算法相结合…...

如何通过 Windows 图形界面找到 WSL 主目录
WSL(Windows Subsystem for Linux)是微软开发的一个软件层,用于在 Windows 11 或 10 上原生运行 Linux 二进制可执行文件。当你在 WSL 上安装一个 Linux 发行版时,它会在 Windows 内创建一个 Linux 环境,包括自己的文件系统和主目录。但是,如何通过 Windows 的图形文件资…...

深入 MySQL 查询优化器:Optimizer Trace 分析
目录 一、前言 二、参数详解 optimizer_trace optimizer_trace_features optimizer_trace_max_mem_size optimizer_trace_limit optimizer_trace_offset 三、Optimizer Trace join_preparation join_optimization condition_processing substitute_generated_column…...

每日一道leetcode
790. 多米诺和托米诺平铺 - 力扣(LeetCode) 题目 有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。 给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返…...
FFmpeg在Android开发中的核心价值是什么?
FFmpeg 在 Android 开发中的核心价值主要体现在其强大的多媒体处理能力和灵活性上,尤其在音视频编解码、流媒体处理及跨平台兼容性方面具有不可替代的作用。以下是具体分析: --- 1. 强大的音视频编解码能力 - 支持广泛格式:FFmpeg 支持几乎所…...
C#进阶(1) ArrayList
前言 在我们进行了入门,基础,核心的学习后,我们已经学了相当多的知识了,不知道你现在对比打开入门时候的你,进步了多少。是否也能自己写一点简单的程序来作为小成就炫耀一下呢? 博主给你留的小项目你是否都有认真去复刻或者改进呢? 这些问题的答案只有你自己清楚。 …...
竞业禁止协议中AI技能限制的深度剖析
首席数据官高鹏律师团队 在当今科技飞速发展的时代,人工智能(AI)领域成为了商业竞争的关键战场。随着AI技术在各行业的广泛渗透,竞业禁止协议中涉及AI技能的限制条款愈发受到关注,其背后蕴含着复杂而关键的法律与商业…...
动态查找滚动容器(通用方案)
需求:点击置顶按钮返回页面的顶部,涉及产生滚动条的元素不唯一的情况,如果确定滚动元素的情况,直接元素.scrollTop 0 就实现置顶了 也是查了一段时间,这个方法很赞,递归寻找滚动元素 步骤 1:判…...

CD3MN 双相钢 2205 材质保温 V 型球阀:恒温工况下复杂介质控制的高性能之选-耀圣
CD3MN 双相钢 2205 材质保温 V 型球阀:恒温工况下复杂介质控制的高性能之选 在石油化工、沥青储运、食品加工等行业中,带颗粒高粘度介质与料浆的恒温输送面临着腐蚀、磨损、堵塞等多重挑战。普通阀门难以兼顾耐高温、强密封与耐腐蚀性,导致设…...
SpringBoot整合MyBatis-Plus:零XML实现高效CRUD
前言 作为一名开发者,数据库操作是我们日常工作中不可或缺的部分。传统的MyBatis虽然强大,但需要编写大量XML映射文件,这在快速开发的今天显得效率不足。MyBatis-Plus(简称MP)作为MyBatis的增强工具,在保留…...

python酒店健身俱乐部管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...

嵌入式开发学习(第二阶段 C语言基础)
综合案例《猜拳游戏》 需求: 本游戏是一款单机游戏,人机交互 规则: 需要双方出拳:石头、剪刀、布赢: 石头→剪刀剪刀→ 布布 →石头 两边出拳相等输: … 实现: 选择对手玩家出拳对手出拳判断胜…...
Easysearch 时序数据的基于时间范围的合并策略
如果你正在使用 Easysearch 处理日志、监控指标、事件流或其他任何具有时间顺序的数据,那么你一定知道索引的性能和效率至关重要。Easysearch 底层的 Lucene Segment 合并是保持搜索和索引性能的关键后台任务。然而,你是否意识到,默认的合并策…...
【C++】深入理解 unordered 容器、布隆过滤器与分布式一致性哈希
【C】深入理解 unordered 容器、布隆过滤器与分布式一致性哈希 在日常开发中,无论是数据结构优化、缓存设计,还是分布式架构搭建,unordered_map、布隆过滤器和一致性哈希都是绕不开的关键工具。它们高效、轻量,在性能与扩展性方面…...

YOLOv1:开启实时目标检测的新篇章
YOLOv1:开启实时目标检测的新篇章 在深度学习目标检测领域,YOLO(You Only Look Once)系列算法无疑占据着重要地位。其中,YOLOv1作为开山之作,以其独特的设计理念和高效的检测速度,为后续的目标…...
Spring Boot 整合 Redis 实战
一、整合准备:环境与依赖 1. 技术栈说明 Spring Boot 版本:3.1.2(兼容 Java 17) Redis 服务器:Redis 7.0(本地部署或 Docker 容器) Maven 依赖: <dependency><…...
Spring事务失效的全面剖析
文章目录 1. Spring事务基础1.1 什么是Spring事务1.2 Spring事务的实现原理1.3 `@Transactional`注解的主要属性1.4 使用Spring事务的简单示例2. Spring事务失效的常见场景及解决方案2.1 方法不是public的问题描述问题示例解决方案技术原理解释2.2 自调用问题(同一个类中的方法…...
Pytorch张量和损失函数
文章目录 张量张量类型张量例子使用概率分布创建张量正态分布创建张量 (torch.normal)正态分布创建张量示例标准正态分布创建张量标准正态分布创建张量示例均匀分布创建张量均匀分布创建张量示例 激活函数常见激活函数 损失函数(Pytorch API)L1范数损失函数均方误差损失函数交叉…...
消息~组件(群聊类型)ConcurrentHashMap发送
为什么选择ConcurrentHashMap? 在开发聊天应用时,我们需要存储和管理大量的聊天消息数据,这些数据会被多个线程频繁访问和修改。比如,当多个用户同时发送消息时,服务端需要同时处理这些消息的存储和查询。如果用普通的…...

FFmpeg多路节目流复用为一路包含多个节目的输出流
在音视频处理领域,将多个独立的节目流(如不同频道的音视频内容)合并为一个包含多个节目的输出流是常见需求。FFmpeg 作为功能强大的多媒体处理工具,提供了灵活的流复用能力,本文将通过具体案例解析如何使用 FFmpeg 实现…...

分子动力学模拟揭示点突变对 hCFTR NBD1结构域热稳定性的影响
囊性纤维化(CF) 作为一种严重的常染色体隐性遗传疾病,全球约有 10 万名患者深受其害。它会累及人体多个器官,如肺部、胰腺等,严重影响患者的生活质量和寿命。CF 的 “罪魁祸首” 是 CFTR 氯离子通道的突变,…...

关于SIS/DCS点检周期
在中国化工行业,近几年在设备维护上有个挺有意思的现象,即SIS和DCS这两个系统的点检周期问题,隔三差五就被管理层会议讨论,可以说是企业管理层关注的重要方向与关心要素。 与一般工业行业中设备运维不同,SIS与DCS的点…...
python-pyqt6框架工具开发总结
菜单栏 工具栏 状态栏 QTreeView 用于展示树形结构数据(模-视图框架),文件系统,组织结构 通常与QAbstractItemModel的子类(如QStandardItemModel或自动义模型) 展开/折叠 控制节点的显示状态,展开时显示子节点,折叠时隐藏子节点 s…...
Docker Volumes
Docker Volumes 是 Docker 提供的一种机制,用于持久化存储容器数据。与容器的生命周期不同,Volumes 可以独立存在,即使容器被删除,数据仍然保留。以下是关于 Docker Volumes 的详细说明: 1. 为什么需要 Volumes&#…...

【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
1 限流的重要性 在高并发系统中,保护系统稳定运行的关键技术有缓存、降级和限流。 缓存通过在内存中存储常用数据,减少对数据库的访问,提升系统响应速度,如浏览器缓存、CDN缓存等多种应用层面。降级则是在系统压力过大或部分服务…...
FPGA实战项目2———多协议通信控制器
1. 多协议通信控制器模块 (multi_protocol_controller) 简要介绍 这是整个设计的顶层模块,承担着整合各个子模块的重要任务,是整个系统的核心枢纽。它负责协调 UART、SPI、I2C 等不同通信协议模块以及 DMA 模块的工作,同时处理不同时钟域之间的信号交互,确保各个模块能够…...

CST软件仿真案例——太阳能薄膜频谱吸收率
CST软件中的太阳能薄膜的功率吸收可用光频电磁波在介质材料中的损耗来计算。本案例计算非晶硅的功率吸收,然后考虑真实太阳频谱,计算有效吸收频谱。 用太阳能单元模板,时域求解器: 材料库提取四个材料,非晶硅…...
多线程进阶核心知识详解(通俗版)
Java多线程进阶详解 一、锁策略:如何高效管理资源竞争 在多线程环境中,锁是协调资源访问的核心机制。不同的锁策略适用于不同的场景,理解它们的差异能帮助优化程序性能。 1. 乐观锁 vs 悲观锁 悲观锁: 核心思想:假设…...