使用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 相关文章推荐
5款Javascript颜色选择器
Oct 25 Javascript
Notify - 基于jquery的消息通知插件
Oct 18 Javascript
对table和ul实现js分页示例分享
Feb 24 Javascript
JavaScript中的Truthy和Falsy介绍
Jan 01 Javascript
canvas简单快速的实现知乎登录页背景效果
May 08 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
Oct 15 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
Apr 03 Javascript
浅谈Vue 数据响应式原理
May 07 Javascript
让axios发送表单请求形式的键值对post数据的实例
Aug 11 Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 Javascript
uniapp,微信小程序中使用 MQTT的问题
Jul 11 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中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
告诉大家什么是JSON
2008/06/10 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
怎么清空javascript数组
2013/05/11 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
基于VUE.JS的移动端框架Mint UI的使用
2017/10/11 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
python类参数self使用示例
2014/02/17 Python
Python转换HTML到Text纯文本的方法
2015/01/15 Python
python对url格式解析的方法
2015/05/13 Python
python从入门到精通(DAY 3)
2015/12/20 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
专业技术职务聘任书
2014/03/29 职场文书
团委竞选演讲稿
2014/04/24 职场文书
疾病捐款倡议书
2014/05/13 职场文书
冬季安全检查方案
2014/05/23 职场文书
保护水资源的标语
2014/06/17 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
建国大业观后感600字
2015/06/01 职场文书