当前位置: 首页 > article >正文

Node.js中的URL模块

一、URL 模块基础

1. 模块导入方式

模块导入方式还是根据代码规范使用require或者import来引入模块。

// 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)

使用url.parse("URL参数")来解析URL,获取url中的http、host、post、hostname、search、query,path等信息。

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 (推荐)

使用new URL("URL参数")去解析数据。

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. 模块导入方式 模块导入方式还是根据代码规范使用require或者import来引入模块。 // Node.js 方式 const url require(url);// ES 模块方式 (Node.js 14 或启用 ESM) import * as url from url; 2. 核心功能 解析 URL 字符串 格式化 URL 对象 URL 处…...

2025 Java 微信小程序根据code获取openid,二次code获取手机号【工具类】拿来就用

一、controller调用 /*** 登录** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登录获取session_key和openid** param code 前端传code* return*/GetMapping("/getWXSessionKe…...

window 显示驱动开发-分页视频内存资源

与 Microsoft Windows 2000 显示驱动程序模型不同,Windows Vista 显示驱动程序模型允许创建比可用物理视频内存总量更多的视频内存资源,然后根据需要分页进出视频内存。 换句话说,并非所有视频内存资源都同时位于视频内存中。 GPU 的管道中可…...

【笔记】记一次PyCharm的问题反馈

#工作记录 最近更新至 PyCharm 社区版的最新版本后,我遇到了多个影响使用体验的问题。令人感到不便的是,一些在旧版本中非常便捷的功能,在新版本中却变得操作复杂、不够直观。过去,我一直通过 PyCharm 内置的故障报告与反馈机制反…...

uniapp中vue3和pinia安装依赖npm install失败

目录 一、问题描述 二、问题原因 三、问题解析及解决方案 一、问题描述 用uni-app开发小程序的时候,使用了vue3pinia,安装依赖的时候发现vue和pinia的版本问题,安装失败, npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve np…...

MySQL 8.0 OCP 1Z0-908 131-140题

Q131.You have upgraded the MySQL binaries from 5.7.28 to 8.0.18 by using an in-place upgrade. Examine the message sequence generated during the first start of MySQL 8.0.18: 。。。[System]。。。/usx/sbin/mysqld (mysqld 8.0.18-commercial) starting as process…...

Spring-messaging-Message接口/环境依赖

参考文档1:https://docs.spring.io/spring-integration/reference/index.html 参考文档2:https://www.jackssybin.cn/articles/2021/03/16/1615897840354.html#b3_solo_h4_44 环境配置 由于我使用的是spring boot,所以只有一个依赖&#xf…...

WPF自定义控件开发全指南:多内容切换与动画集成

WPF自定义控件开发全指南:多内容切换与动画集成 一、控件基础架构设计1.1 选择控件基类1.2 定义关键属性 二、动画系统集成2.1 淡入淡出动画实现2.2 滑动动画实现 三、视觉状态管理四、完整使用示例4.1 XAML声明4.2 动画触发逻辑 五、扩展与优化5.1 性能优化建议5.2…...

ECMAScript标准:JavaScript的核心

什么是ECMAScript? ECMAScript(简称ES)是一个由ECMA国际(欧洲计算机制造商协会)制定的脚本语言标准,它为JavaScript、JScript和ActionScript等脚本语言提供了基础规范。JavaScript 可以视为 ECMAScript 的…...

qtc++ qdebug日志生成

本文介绍了将qdebug注册到日志系统,这样qdebug打印的信息将记录在日志文本文件,方便观看程序运行中的历史信息,但是需要注意的是,注册后qdebug的信息将不会打印在qtcreator的输出中,所以作者建议,在开发的时…...

【分布式锁通关指南 10】源码剖析redisson之MultiLock的实现

引言 本期我们将把目光聚焦在 Redisson 中另一个颇具代表性的分布式锁实现——MultiLock。它的核心思想是:一次性对多个独立的 RLock 进行加锁或解锁操作,只有当多个锁都成功加锁时才算真正完成锁的获取,一旦有任何一个失败,整体操…...

DBF Converter:高效转换DBF文件,满足多样化数据处理需求

DBF Converter 是一款功能强大的数据转换工具,专为需要将DBF文件转换为其他格式的用户设计。它支持将DBF文件转换为CSV、Excel、HTML、SQL等多种常见格式,满足用户在不同场景下的数据处理需求。无论是数据迁移、报表生成还是日常数据处理,DBF…...

Java—— 方法引用 : :

方法引用是什么 把已经存在的方法拿过来用,当做函数式接口中抽象方法的方法体 方法引用符 :: 方法引用的条件 1.需要有函数式接口 2.被引用方法必须已经存在 3.被引用方法的形参和返回值需要跟抽象方法保持一致 4.被引用方法的功能要满足当前…...

Jmeter 安装包与界面汉化

Jmeter 安装包: 通过网盘分享的文件:CSDN-apache-jmeter-5.5 链接: https://pan.baidu.com/s/17gK98NxS19oKmkdRhGepBA?pwd1234 提取码: 1234 Jmeter界面汉化:...

6 任务路由与负载均衡

一、任务路由核心机制 1.1 静态路由配置 # celeryconfig.pytask_routes {# 精确匹配任务路径payment.process_order: {queue: priority_payment},# 通配符匹配任务类型report.*: {queue: low_priority_reports},# 正则表达式匹配re.compile(r^video\.(encode|compress)): {q…...

【C++】 —— 笔试刷题day_29

一、排序子序列 题目解析 一个数组的连续子序列,如果这个子序列是非递增或者非递减的;这个连续的子序列就是排序子序列。 现在给定一个数组,然后然我们判断这个子序列可以划分成多少个排序子序列。 例如:1 2 3 2 2 1 可以划分成 …...

Ruby 循环与迭代器

Ruby 循环与迭代器 循环迭代器timesuptostep 循环 。。。。 迭代器 迭代器本质上可以理解为是循环的一种类型 times 3.times do print "Ho! " end begin Ho! Ho! Ho! end上述代码表示我们对当前 block 部分中的内容循环三次。最终,我们打印出了三个…...

力扣-39.组合总和

题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…...

优化 Element UI 表格样式,隐藏滚动条但保持滚动功能

优化 Element UI 表格样式,隐藏滚动条但保持滚动功能 前言 在基于 Element UI 的项目中,el-table 是非常常用的表格组件。默认情况下,表格的滚动条可能影响页面的美观,特别是在视觉设计上希望更简洁时。本文分享一段优化的 CSS …...

线程池(ThreadPoolExecutor)实现原理和源码细节是Java高并发面试和实战开发的重点

一、线程池核心流程图 ----------------- | 提交任务 | submit/execute -----------------|v ----------------- | 判断核心线程数 | < corePoolSize&#xff1f; -----------------|Yes |Nov v [创建新线程] -----------------| 队列是否满&a…...

MongoTemplate 基础使用帮助手册

前言 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;适合存储大量的非结构化数据。MongoTemplate 是 Spring Data MongoDB 中的一个核心组件&#xff0c;它提供了一组丰富的 API 来与 MongoDB 进行交互。它封装了许多常见的数据库操作&#xff0c;使开发者能够轻松执行 CRUD 操…...

图像处理:预览并绘制图像细节

前言 因为最近在搞毕业论文的事情&#xff0c;要做出一下图像细节对比图&#xff0c;所以我这里写了两个脚本&#xff0c;一个用于框选并同时预览图像放大细节&#xff0c;可显示并返回框选图像的坐标&#xff0c;另外一个是输入框选图像的坐标并将放大的细节放置在图像中&…...

力扣热题——最长相邻不相等子序列 |

题目要求从字符串数组 words 中选出一个最长的子序列&#xff0c;使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法&#xff0c;可以高效地解决该问题。具体步骤为&#xff1a;初始化一个结果列表&#xff0c;遍历 words 数组&#xff0c;检查当前字符串的…...

【抽丝剥茧知识讲解】引入mybtis-plus后,mapper实现方式

目录 前言一、传统 Mapper 接口方式二、继承 BaseMapper 的方式三、自定义通用 Mapper 的方式四、使用 MyBatis-Plus 的 ActiveRecord 模式五、使用 MyBatis-Plus 的 IService 接口六、使用建议 前言 mapper文件&#xff0c;作为Mybatis框架中定义SQL语句和映射关系的配置文件&…...

ssti刷刷刷

[NewStarCTF 公开赛赛道]BabySSTI_One 测试发现过滤关键字&#xff0c;但是特殊符号中括号、双引号、点都能用 可以考虑拼接或者编码&#xff0c;这里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…...

java+selenum专题(一)

环境搭建部署篇-> 1.简介 java版的selenium&#xff0c;介绍一下java selenium自动化测试。大致和pythonselenium自动化测试差不多。基于java和selenium做自动化测试&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&…...

物体雅克比、空间雅克比、解析雅克比、几何雅克比

在机器人学中&#xff0c;雅可比矩阵是连接广义坐标速度与末端执行器速度的关键工具。根据应用场景和参考系的不同&#xff0c;雅可比矩阵可分为物体雅可比&#xff08;Body Jacobian&#xff09;、空间雅可比&#xff08;Space Jacobian&#xff09;、解析雅可比&#xff08;A…...

[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)

[逆向工程]DebugView捕获WPS日志&#xff1f;解析未运行WPS时Shell扩展加载的原因与解决方案&#xff08;二十五&#xff09; 引言&#xff1a;一个“幽灵”般的日志问题 你是否在使用 DebugView 排查系统问题时&#xff0c;发现日志中频繁出现 WPS 相关模块&#xff08;如 k…...

ACM模式用Scanner和System.out超时的解决方案和原理

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;笔试强训 &#x1f4da;本系列文章为个人学…...

Java注解详解:从入门到实战应用篇

1. 引言 Java注解&#xff08;Annotation&#xff09;是JDK 5.0引入的一种元数据机制&#xff0c;用于为代码提供附加信息。它广泛应用于框架开发、代码生成、编译检查等领域。本文将从基础到实战&#xff0c;全面解析Java注解的核心概念和使用场景。 2. 注解基础概念 2.1 什…...