使用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 相关文章推荐
javascript 获取网页参数系统
Jul 19 Javascript
javascript jq 弹出层实例
Aug 25 Javascript
js将字符串转成正则表达式的实现方法
Nov 13 Javascript
JavaScript获取table中某一列的值的方法
May 06 Javascript
一个简单的全屏图片上下打开显示网页效果示例
Jul 08 Javascript
JavaScript父子窗体间的调用方法
Mar 31 Javascript
JavaScript字符串常用的方法
Mar 10 Javascript
jquery获取img的src值的简单实例
May 17 Javascript
JavaScript实现DOM对象选择器
Sep 24 Javascript
微信小程序 数据交互与渲染实例详解
Jan 21 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
Vue请求java服务端并返回数据代码实例
Nov 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编写的导航条程序
2006/10/09 PHP
基于php上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
php自动获取关键字的方法
2015/01/06 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
Python datetime时间格式化去掉前导0
2014/07/31 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
python决策树之CART分类回归树详解
2017/12/20 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
Django后台admin的使用详解
2019/07/08 Python
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
学校办公室主任职责
2013/12/27 职场文书
八年级语文教学反思
2014/02/11 职场文书
信访工作个人总结
2015/03/03 职场文书
sql server 累计求和实现代码
2022/02/28 SQL Server
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers