url 模块学习笔记
使用场景:
- url 模块经常与 querystring 模块联合使用;
- 如果你想要对浏览器地址栏里的地址进行处理可以使用这个模块;
- 处理过程无非两个方法,将地址栏的字符串解析为对象和将一个对象变成一个 url 地址;
- 此外,你可能还需要获得 url 地址中携带的参数,像这样 www.xxx.com?name=bob&age=21。
如果你没有以上需求,可以略过以下部分以节约你的时间。
原生模块
url 模块是 node.js 原生自带的库,无需安装,直接通过 var url = require('url') 就可以使用。
parse()
- 作用: 将 url 字符串变成对象
示例代码: 新建 parse.js 文件,内容如下:
var url = require('url'); var urlString = 'http://user:[email protected]:8080/p/a/t/h?query=string#hash'; var result = url.parse(urlString); console.log(result);
打印结果如下:
Url { protocol: 'http:', slashes: true, auth: 'user:pass', host: 'host.com:8080', port: '8080', hostname: 'host.com', hash: '#hash', search: '?query=string', query: 'query=string', pathname: '/p/a/t/h', path: '/p/a/t/h?query=string', href: 'http://user:[email protected]:8080/p/a/t/h?query=string#hash' }
对象属性详解
href: 解析前的完整原始 URL,协议名和主机名已转为小写 例如: 'http://user:[email protected]:8080/p/a/t/h?query=string#hash' protocol: 请求协议,小写 例如: 'http:' slashes: 协议的“:”号后是否有“/” 例如: true or false host: URL主机名,包括端口信息,小写 例如: 'host.com:8080' auth: URL中的认证信息 例如: 'user:pass' hostname: 主机名,小写 例如: 'host.com' port: 主机的端口号 例如: '8080' pathname: URL中路径 例如: '/p/a/t/h' search: 查询对象,即:queryString,包括之前的问号“?” 例如: '?query=string' path: pathname 和 search的合集 例如: '/p/a/t/h?query=string' query: 查询字符串中的参数部分(问号后面部分字符串),或者使用 querystring.parse() 解析后返回的对象 例如: 'query=string' or {'query':'string'} hash: 锚点部分(即:“#”及其后的部分) 例如: '#hash'
format()
- 作用: 将符合条件的对象变成 url 字符串
示例代码: 新建 format.js 文件,内容如下:
var url = require('url'); var urlObj = { protocol: 'http:', slashes: true, hostname: 'itbilu.com', port: 80, hash: '#hash', search: '?query=string', path: '/nodejs?query=string' } var result = url.format(urlObj); console.log(result);
打印结果如下:
http://itbilu.com:80?query=string#hash
转换机理简单介绍
*href 属性会被忽略 *protocol无论是否有末尾的 : (冒号),会同样的处理 *这些协议包括 http, https, ftp, gopher, file 后缀是 :// (冒号-斜杠-斜杠). *所有其他的协议如 mailto, xmpp, aim, sftp, foo, 等 会加上后缀 : (冒号) *auth 如果有将会出现. *hostname 如果 host 属性没被定义,则会使用此属性. *port 如果 host 属性没被定义,则会使用此属性. *host 优先使用,将会替代 hostname 和port *pathname 将会同样处理无论结尾是否有/ (斜杠) *search 将会替代 query属性 *query (object类型; 详细请看 querystring) 如果没有 search,将会使用此属性. *search 无论前面是否有 ? (问号),都会同样的处理 *hash无论前面是否有# (井号, 锚点),都会同样处理