模块概述

nodejs中,提供了url这个非常实用的模块,用来做URL的解析。在做node服务端的开发时会经常用到。使用很简单,总共只有3个方法。

正式讲解前,各位同学先把下面这个图记在心上(来自nodejs官网),先对URL有一个直观的认识。

模块方法概述

url模块三个方法分别是:

  • .parse(urlString):将url字符串,解析成object,便于开发者进行操作。
  • .format(urlObj):.parse() 方法的反向操作。
  • .resove(from, to):以from作为起始地址,解析出完整的目标地址(还是看直接看例子好些)

url解析:url.parse()

完整语法:url.parse(urlString[, parseQueryString[, slashesDenoteHost]])

使用比较简单,几个要点备忘如下。

  1. parseQueryString:(默认为false)如为false,则urlObject.query为未解析的字符串,比如nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1,且对应的值不会decode;如果parseQueryString为true,则urlObject.query为object,比如{ nick: '程序猿小卡' },且值会被decode;
  2. slashesDenoteHos:(默认为false)如果为true,那么类似//foo/bar里的foo就会被认为是hostname;如果为false,则foo被认为是pathname的一部分。
  3. 关于解析得到的 urlObject ,会在下一小节进行详细介绍。

例子1:参数值不进行解析

代码如下:

var url = require('url');
var str = 'http://Chyingp:HelloWorld@ke.qq.com:8080/index.html?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1#part=1'; var obj = url.parse(str);
console.log(obj);

输出如下:

Url {
protocol: 'http:',
slashes: true,
auth: 'Chyingp:HelloWorld',
host: 'ke.qq.com:8080',
port: '8080',
hostname: 'ke.qq.com',
hash: '#part=1',
search: '?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1',
query: 'nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1',
pathname: '/index.html',
path: '/index.html?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1',
href: 'http://Chyingp:HelloWorld@ke.qq.com:8080/index.html?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1#part=1' }

例子2:对参数值进行decode

代码如下:

var url = require('url');
var str = 'http://Chyingp:HelloWorld@ke.qq.com:8080/index.html?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1#part=1'; var obj = url.parse(str, true);
console.log(obj);

输出如下,对比上面的例子会发现,query 字段被解析成了object,并且decode过。

Url {
protocol: 'http:',
slashes: true,
auth: 'Chyingp:HelloWorld',
host: 'ke.qq.com:8080',
port: '8080',
hostname: 'ke.qq.com',
hash: '#part=1',
search: '?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1',
query: { nick: '程序猿小卡' },
pathname: '/index.html',
path: '/index.html?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1',
href: 'http://Chyingp:HelloWorld@ke.qq.com:8080/index.html?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1#part=1' }

例子3:针对路径 //foo/bar 的处理

代码如下:

var url = require('url');
var str = '//foo/bar'; var obj = url.parse(str, true, false);
console.log(obj); obj = url.parse(str, true, true);
console.log(obj);

输出如下,自行对比两者之间的差异:

Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '',
query: {},
pathname: '//foo/bar',
path: '//foo/bar',
href: '//foo/bar' }
Url {
protocol: null,
slashes: true,
auth: null,
host: 'foo',
port: null,
hostname: 'foo',
hash: null,
search: '',
query: {},
pathname: '/bar',
path: '/bar',
href: '//foo/bar' }

关于urlObject

以上面的作为例子,粗略讲解下urlObject。更多细节可参考官方文档

  • protocol:协议,需要注意的是包含了:,并且是小写的。
  • slashes:如果:后面跟了两个//,那么为true。
  • auth:认证信息,如果有密码,为usrname:passwd,如果没有,则为usrname。注意,这里区分大小写。
  • host:主机名。注意包含了端口,比如ke.qq.com:8080,并且是小写的。
  • hostname:主机名,不包含端口,并且是小写的。
  • hash:哈希部分,注意包含了#
  • search:查询字符串,注意,包含了?,此外,值是没有经过decode的。
  • query:字符串 或者 对象。如果是字符串,则是search去掉?,其余一样;如果是对象,那么是decode过的。
  • path:路径部分,包含search部分。
  • pathname:路径部分,不包含search部分。
  • href:原始的地址。不过需要注意的是,protocolhost会被转成小写字母。
{
protocol: 'http:',
slashes: true,
auth: 'Chyingp:HelloWorld',
host: 'ke.qq.com:8080',
port: '8080',
hostname: 'ke.qq.com',
hash: '#part=1',
search: '?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1',
query: { nick: '程序猿小卡' },
pathname: '/index.html',
path: '/index.html?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1',
href: 'http://Chyingp:HelloWorld@ke.qq.com:8080/index.html?nick=%E7%A8%8B%E5%BA%8F%E7%8C%BF%E5%B0%8F%E5%8D%A1#part=1' }

url拼接:url.format(urlObject)

完整语法:url.format(urlObject)

url.parse(str)的反向操作,没什么好说的。urlObject包含了很多字段,比如protocolslashesprotocol等,且不一定需要全部传,所以有一套解析逻辑。

过程比较冗长,大部分时候不需要用到,直接贴官方文档的链接,有需要再看。

url.resolve(from, to)

用法比较简单,直接贴官方文档的例子

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'

非法字符转义

url字符是有哥下面的字符会被转义(非法字符)

< > " ` \r \n \t { } | \ ^ '

相关链接

官方文档:https://nodejs.org/api/url.html#url_url

NodeJS学习笔记 (12)网络地址解析-url(ok)的更多相关文章

  1. nodejs学习笔记之网络编程

    了解一下OSI七层模型   OSI层 功能 TCP/IP协议 应用层 文件传输,电子邮件,文件服务,虚拟终端  TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 数据格式化 ...

  2. NodeJS学习笔记 (8)网络服务-http-server(ok)

    http服务端概览 创建server 几行代码搞定 var http = require('http'); var requestListener = function(req, res){ res. ...

  3. NodeJS学习笔记 (5)网络服务-http-req(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: 概览 本文的重点会放在req这个对象上.前面已经提到,它其实是http.Incom ...

  4. NodeJS学习笔记 (4)网络服务-http(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: http模块概览 大多数nodejs开发者都是冲着开发web server的目的选 ...

  5. nodejs学习笔记<三>关于路由(url)

    在网站开发中,路由的设置非常关键.nodejs对路由处理封装了一个比较全面的模块. 来认识下url模块 1)在命令行(cmd)可以直接 node —> url 可直接查看url模块的所有方法. ...

  6. NodeJS学习笔记 (9)网络服务-https(ok)

    模块概览 这个模块的重要性,基本不用强调了.在网络安全问题日益严峻的今天,网站采用HTTPS是个必然的趋势. 在nodejs中,提供了 https 这个模块来完成 HTTPS 相关功能.从官方文档来看 ...

  7. NodeJS学习笔记 (7)网络服务-http-client(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: ClientRequest概览 当你调用 http.request(options ...

  8. NodeJS学习笔记 (11)网络UDP-dgram(ok)

    模块概览 dgram模块是对UDP socket的一层封装,相对net模块简单很多,下面看例子. UPD客户端 vs UDP服务端 首先,启动UDP server,监听来自端口33333的请求. se ...

  9. NodeJS学习笔记 (10)网络TCP-net(ok)

    模块概览 net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net. ...

随机推荐

  1. [JZOJ 5465] [NOIP2017提高A组冲刺11.9] 道路重建 解题报告 (e-dcc+树的直径)

    题目链接: http://172.16.0.132/senior/#main/show/5465 题目: 小X所居住的X国共有n个城市,有m条无向道路将其连接.作为一个统一的国家,X 城的任意两个城市 ...

  2. UISrcoll控件简单介绍

    UISrcoll控件,简单的说就是让界面滑动 当使用uiimageview的时候,给控件设置图片素材时,图片的大小会根据控件的大小,自动做缩放 当使用uibutton的时候,如果是设置背景图,name ...

  3. sql server Delete误操作后如何恢复数据

    声明:本文是根据别人的经验https://blog.csdn.net/dba_huangzj/article/details/8491327写的总结 说明:update和delete时没有加where ...

  4. Core Java(二)

    二 .JAVA语言基础 1.注释,标识符,关键字  Comments         用于解释说明程序的文字 Java中注释分类格式 单行注释:格式: //注释文字                多行 ...

  5. vue反向代理解决跨域

    问题描述 在项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包的时候,我们在本地启动服务器后,比如本地开发服务下是 http ...

  6. 解决IIS服务器部署 字体图标找不到的原因

    引言 我们往往在IIS上部署Web项目,或者发布Web项目的时候,经常会遇到浏览器找不到字体文件(woff/woff2)产生的错误.这样会导致浏览器无法加载字体图标,在影响加载时间的同时,更无法显示对 ...

  7. Python数据分析前提-----pandas

    1.read_csv(url):读取数据 2.help(read_csv):打印函数相关用法 3.数据名.dtypes:读取数据的类型(int.float……) 4.type(数据名):读取所有数据的 ...

  8. 关于Python的装饰器

    false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {m ...

  9. NOIp2018模拟赛四十

    今天太晚了...题解到时候补吧(flag立好) 成绩:100+0+0=100 感觉A题本质暴力贪心?C题一道水题我居然没做...亏爆 A:[agc011e]increasing numbers B:[ ...

  10. BZOJ 2938 [POI2000]病毒 (剪枝/A*迭代搜索)

    LOJ BZOJ 题目大意:给你一些模式串,问是否存在一个无限长的文本串,不包含任何一个给定的模式串 并没有想到去模拟合法的文本串在模式串的Trie图上匹配的过程..我好菜啊 如果一个字符串合法,那么 ...