nodejs中,提供了url这个非常实用的模块,用来做URL的解析。在做node服务端的开发时会经常用到。使用很简单,总共只有3个方法。
先看下面这个图,介绍了url相关知识点
url模块三个方法分别是:
完整语法:url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
使用比较简单,几个要点备忘如下。
urlObject.query
为未解析的字符串,比如https://www.oecom.cn/?name=%E8%90%BD%E5%B8%86%E4%BA%AD
,且对应的值不会decode;如果parseQueryString
为true,则urlObject.query
为object,比如{ name: '落帆亭' }
,且值会被decode;//foo/bar
里的foo
就会被认为是hostname
;如果为false,则foo
被认为是pathname的一部分。也就是说parseQueryString不填,或者写成false
var url = require('url');
var str = 'http://Chyingp:HelloWorld@ke.qq.com:8080/index.htm?lname=%E8%90%BD%E5%B8%86%E4%BA%AD#part=1';
var obj = url.parse(str);
console.log(obj);
其输出解析结果为
在上图当中query字段并不是JSON对象的形式,而且参数也是经过url编码之后的形式。
也就是说parseQueryString写成true
var url = require('url');
var str = 'http://Chyingp:HelloWorld@ke.qq.com:8080/index.htm?lname=%E8%90%BD%E5%B8%86%E4%BA%AD#part=1';
var obj = url.parse(str,true);
console.log(obj);
通过对比可以看出解析之后的query变成了一个JSON格式的对象,方便开发时获取参数。
slashesDenoteHost 是指当url是 ‘http://’ 或 ‘ftp://’ 等标志的协议前缀打头的,或直接以地址打头,如 ‘127.0.0.1’ 或 ‘localhost’ 时候是没有区别的;当且仅当以2个斜杠打头的时候,比如 ‘//127.0.0.1’ 才有区别。这时候,如果其值为true,则第一个单个 ‘/’ 之前的部分被解析为 ‘host’ 和 ‘hostname’,如 ” host : ‘127.0.0.1’ “,如果为false,包括2个反斜杠在内的所有字符串被解析为pathname。
以//localhost/www/index?name=落帆亭&password=123456为例
var url = require('url')
var path = '//localhost/www/index?name=落帆亭&password=123456';
var obj = url.parse(path,true,true);
console.log(obj);
输出结果
当值为false时
var url = require('url')
var path = '//localhost/www/index?name=落帆亭&password=123456';
var obj = url.parse(path,true,false);
console.log(obj);
结果为
可自行对比两个结果之间的差异。
下面来详细看一下urlobject中各属性的具体含义
:
,并且是小写的。:
后面跟了两个//
,那么为true。usrname:passwd
,如果没有,则为usrname
。注意,这里区分大小写。ke.qq.com:8080
,并且是小写的。#
。?
,此外,值是没有经过decode的。search
去掉?
,其余一样;如果是对象,那么是decode过的。protocol
、host
会被转成小写字母。完整语法:url.format(urlObject)
url.parse(str)
的反向操作,urlObject
包含了很多字段,比如protocol
、slashes
、protocol
等,且不一定需要全部传。
url.format({
protocol: 'https',
hostname: 'oecom.cn',
pathname: '/some/path',
query: {
page: 1,
format: 'json'
}
});
输出结果为
'https://oecom.cn/some/path?page=1&format=json'
这个方法类似于解析锚标记HREF的Web浏览器的方式解析相对于基本URL的目标URL。下面请之间看例子
const url = require('url');
url.resolve('/one/two/three', 'four'); // '/one/two/four'
url.resolve('http://example.com/', '/one'); // 'http://example.com/one'
url.resolve('http://example.com/one', '/two'); // 'http://example.com/two'