使用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 相关文章推荐
解析arp病毒背后利用的Javascript技术附解密方法
Aug 06 Javascript
通过onmouseover选项卡实现img图片的变化
Feb 12 Javascript
jQuery源码分析之jQuery中的循环技巧详解
Sep 06 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 Javascript
跟我学习javascript的异步脚本加载
Nov 20 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
Nov 18 Javascript
js原生实现FastClick事件的实例
Nov 20 Javascript
实例详解display:none与visible:hidden的区别
Mar 30 Javascript
微信小程序使用map组件实现解析经纬度功能示例
Jan 22 Javascript
微信小程序实现吸顶特效
Jan 08 Javascript
vscode调试node.js的实现方法
Mar 22 Javascript
小程序自定义轮播图圆点组件
Jun 25 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计算页面执行时间的实现代码
2013/06/18 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
点击文章内容处弹出页面代码
2009/10/01 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
JavaScript中的时间处理小结
2016/02/24 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
jQuery操作元素追加内容示例
2020/01/10 jQuery
Node.js Domain 模块实例详解
2020/03/18 Javascript
TensorFlow 合并/连接数组的方法
2018/07/27 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
python 实现IP子网计算
2021/02/18 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
农业大学毕业生的个人自我评价
2013/10/11 职场文书
手机业务员岗位职责
2013/12/13 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
2014年小学教导处工作总结
2014/12/19 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书