使用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 相关文章推荐
jQuery实现的原图对比窗帘效果
Jun 15 Javascript
基于jQuery实现文本框缩放以及上下移动功能
Nov 24 Javascript
node.js中的console.info方法使用说明
Dec 09 Javascript
jQuery验证插件validate使用详解
May 11 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
Sep 05 Javascript
微信小程序表单验证错误提示效果
May 19 Javascript
Bootstrap实现翻页效果
Nov 27 Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
详解vue在项目中使用百度地图
Mar 26 Javascript
axios实现简单文件上传功能
Sep 25 Javascript
js实现多个标题吸顶效果
Jan 08 Javascript
如何在 Vue 表单中处理图片
Jan 26 Vue.js
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完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
PHP下对字符串的递增运算代码
2010/08/21 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
javascript实现禁止右键和F12查看源代码
2014/12/26 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
node通过npm写一个cli命令行工具
2017/10/12 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
wxPython学习之主框架实例
2014/09/28 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
pytorch数据预处理错误的解决
2020/02/20 Python
解决tensorflow 释放图,删除变量问题
2020/06/23 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
物业管理专业求职信
2014/06/11 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
python自动化八大定位元素讲解
2021/07/09 Python