使用node.JS中的url模块解析URL信息


Posted in Javascript onFebruary 06, 2020

在HTTP部分,详细介绍了URL的相关知识。而nodejs中的url模块提供了一些实用函数,用于URL处理与解析。

解析URL

解析 URL 对象有以下内容,依赖于他们是否在 URL 字符串里存在。任何不在 URL 字符串里的部分,都不会出现在解析对象里

'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'

┌─────────────────────────────────────────────────────────────────────────────┐

│                                    href                                     │

├──────────┬┬───────────┬─────────────────┬───────────────────────────┬───────┤

│ protocol ││   auth    │      host       │           path            │ hash  │

│          ││           ├──────────┬──────┼──────────┬────────────────┤       │

│          ││           │ hostname │ port │ pathname │     search     │       │

│          ││           │          │      │          ├─┬──────────────┤       │

│          ││           │          │      │          │ │    query     │       │

"  http:   // user:pass @ host.com : 8080   /p/a/t/h  ?  query=string   #hash "

│          ││           │          │      │          │ │              │       │

└──────────┴┴───────────┴──────────┴──────┴──────────┴─┴──────────────┴───────┘

href: 准备解析的完整的 URL,包含协议和主机(小写)

'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'

protocol: 请求协议, 小写

'http:'

slashes: 协议要求的斜杠(冒号后)

true 或 false

host: 完整的 URL 小写 主机部分,包含端口信息

'host.com:8080'

auth: url 中的验证信息

'user:pass'

hostname: 域名中的小写主机名

'host.com'

port: 主机的端口号

'8080'

pathname: URL 中的路径部分,在主机名后,查询字符前,包含第一个斜杠

'/p/a/t/h'

search: URL 中的查询字符串,包含开头的问号

'?query=string'

path: pathname 和 search 连在一起

'/p/a/t/h?query=string'

query: 查询字符串中得参数部分,或者使用 querystring.parse() 解析后返回的对象

'query=string' or {'query':'string'}

hash: URL 的 “#” 后面部分(包括 # 符号)

'#hash'

URL方法

URL模块包含分析和解析 URL 的工具。调用 require('url') 来访问模块

var url = require('url');
/*
{ parse: [Function: urlParse],
 resolve: [Function: urlResolve],
 resolveObject: [Function: urlResolveObject],
 format: [Function: urlFormat],
 Url: [Function: Url] }
 */
console.log(url);
url.parse(urlStr[, parseQueryString][, slashesDenoteHost])

输入 URL 字符串,返回一个对象

第二个参数parseQueryString(默认为false),如为false,则urlObject.query为未解析的字符串,比如author=%E5%B0%8F%E7%81%AB%E6%9F%B4,且对应的值不会decode;如果parseQueryString为true,则urlObject.query为object,比如{ author: '小火柴' },且值会被decode

第三个参数slashesDenoteHos(默认为false),如果为true,可以正确解析不带协议头的URL,类似//foo/bar里的foo就会被认为是hostname;如果为false,则foo被认为是pathname的一部分

var url = require('url');
var str = 'http://user:pass@host.com:8080/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash';
/*
Url {
 protocol: 'http:',
 slashes: true,
 auth: 'user:pass',
 host: 'host.com:8080',
 port: '8080',
 hostname: 'host.com',
 hash: '#hash',
 search: '?author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
 query: 'author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
 pathname: '/p/a/t/h',
 path: '/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
 href: 'http://user:pass@host.com:8080/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash' }
 */
console.log(url.parse(str));
var url = require('url');
var str = 'http://user:pass@host.com:8080/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash';
/*
Url {
 protocol: 'http:',
 slashes: true,
 auth: 'user:pass',
 host: 'host.com:8080',
 port: '8080',
 hostname: 'host.com',
 hash: '#hash',
 search: '?author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
 query: { author: '小火柴' },
 pathname: '/p/a/t/h',
 path: '/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4',
 href: 'http://user:pass@host.com:8080/p/a/t/h?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash' }
 */
console.log(url.parse(str,true));
var url = require('url');
var str = '//foo/bar';
var result1 = url.parse(str,true);
var result2 = url.parse(str,true,true);
console.log(result1.path);//'//foo/bar'
console.log(result1.pathname);//'//foo/bar'
console.log(result1.hostname);//null
console.log(result2.path);//'/bar'
console.log(result2.pathname);//'/bar'
console.log(result2.hostname);//'foo'

url.format(urlObject)

url.parse(str)的反向操作,输入一个解析过的 URL 对象,返回格式化过的字符串

urlObject包含了很多字段,比如protocol、slashes、protocol等,且不一定需要全部传,所以有一套解析逻辑

格式化的工作流程如下

href 会被忽略

protocol 无论是否有末尾的 : (冒号),会同样的处理

http, https, ftp, gopher, file 协议会被添加后缀://

mailto, xmpp, aim, sftp, foo, 等协议添加后缀:

slashes 如果协议需要 ://,设置为 true

仅需对之前列出的没有斜杠的协议,比如议 mongodb://localhost:8000/

auth 如果出现将会使用.

hostname 仅在缺少 host 时使用

port 仅在缺少 host 时使用

host 用来替换 hostname 和 port

pathname 无论结尾是否有 / 将会同样处理

search 将会替代 query属性

无论前面是否有 / 将会同样处理

query (对象; 参见 querystring) 如果没有 search,将会使用

hash 无论前面是否有#,都会同样处理

var url = require('url');
var obj = {
 protocol: 'http:',
 auth: 'user:pass',
 host: 'host.com:8080',
 hash: '#hash',
 query: { author: '小火柴' }
}
//http://user:pass@host.com:8080?author=%E5%B0%8F%E7%81%AB%E6%9F%B4#hash
console.log(url.format(obj));

url.resolve(from, to)

url.resolve()方法以一种浏览器解析超链接的方式把一个目标URL解析成相对于一个基础URL,参数如下

from <String> 解析时相对的基本 URL。

to <String> 要解析的超链接 URL。

var url = require('url');
console.log(url.resolve('/one/two/three', 'four'));     // '/one/two/four'
console.log(url.resolve('http://example.com/', '/one'));  // 'http://example.com/one'
console.log(url.resolve('http://example.com/one', '/two')); // 'http://example.com/two'

更多关于node.JS中url模块的使用方法大家可参考下面的相关链接

Javascript 相关文章推荐
浅析Prototype的模板类 Template
Dec 07 Javascript
jquery 选取方法都有哪些
May 18 Javascript
用原生js做个简单的滑动效果的回到顶部
Oct 15 Javascript
jQuery+Ajax实现无刷新分页
Oct 30 Javascript
Bootstrap菜单按钮及导航实例解析
Sep 09 Javascript
静态页面实现 include 引入公用代码的示例
Sep 25 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
Dec 24 jQuery
Vue ElementUi同时校验多个表单(巧用new promise)
Jun 06 Javascript
Javascript实现动态时钟效果
Nov 17 Javascript
vue踩坑记录之数组定义和赋值问题
Mar 20 Javascript
layUI实现三级导航菜单效果
Jul 26 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
Sep 28 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
Feb 06 #Javascript
node.JS事件机制与events事件模块的使用方法详解
Feb 06 #Javascript
如何通过javaScript去除字符串两端的空白字符
Feb 06 #Javascript
ckeditor一键排版功能实现方法分析
Feb 06 #Javascript
JavaScript如何判断input数据类型
Feb 06 #Javascript
如何使用Jquery动态生成二级选项列表
Feb 06 #jQuery
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
Feb 06 #Javascript
You might like
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php str_pad 函数用法简介
2009/07/11 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
Python partial函数原理及用法解析
2019/12/11 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
运行Python编写的程序方法实例
2020/10/21 Python
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
幼儿园毕业家长感言
2014/02/10 职场文书
英文求职信写作小建议
2014/02/16 职场文书
税务会计岗位职责
2014/02/18 职场文书
理想国读书笔记
2015/06/25 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
创业计划书详解
2019/07/19 职场文书
python使用torch随机初始化参数
2022/03/22 Python
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技