第七节: 内置模块(三): url模块与path模块

1. url模块

1.1. url的了解

url就是全球统一资源定位符
对网站资源的一种简洁表达形式,也称为网址


1.2. url的构成(重中之重)

一个url是一个结构化的字符串,他包含多个有意义的组成部分,当被解析时,会返回一个url对象


完整结构

协议://用户名:密码@主机名.名.域:端口号/目录名/文件名.扩展名?参数名=参数值#hash


http协议URL常见结构

协议://主机名.名.域/目录名/文件名.扩展名?参数名=参数值&参数名2=参数值2#hash


在通过req.url来获取完整url内容时,获取是包含queryString

例如:

http://127.0.0.1:3000/index.html?id=123#456

此时通过req.url, 获取的值为/index.html?id=123

也就是说querystring是属于req.url,但是hash不属于

但是我们此时要得到文件名的部分,我不想要querystring,此时可以用正则提炼,但是太麻烦了

因此Node给我们提供了内置的模块,url,path,querystring他们都可以服务于URL的识别


1.3. url模块

url模块提供了一些使用的函数,用于URL路径的处理与解析

要注意的是Node提供了两套不同API处理URL

先看一下旧API


1.3.1 url.parse 方法

parse方法,可以将req.url转成对象形式

语法

​ url.parse(urlStr [, parseQueryString])

参数介绍

  1. urlStr 必须 用于指定需要转化的URL 字符串
  2. parseQueryString 可选, 参数是一个布尔值, true表示将querystring转为对象, false, 不转为对象就是一个普通的查询字符串,默认值为false

使用示例

const http = require('http');
// 处理路径的url模块
const url = require('url');

// 创建一个服务器
http.createServer((req, res) => {
  // 将req.url转为对象
  var urlJson = url.parse(req.url)
  console.log(urlJson);
  res.end('');

}).listen(3000);
console.log("Server Start at 3000 port")

/*
http://127.0.0.1:3000/wuwei/index.html?id=123&name=wuwei#456
打印的部分:
Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?id=123&name=wuwei',
  query: 'id=123&name=wuwei',
  pathname: '/wuwei/index.html',
  path: '/wuwei/index.html?id=123&name=wuwei',
  href: '/wuwei/index.html?id=123&name=wuwei' 
 }
*/



同时url.parse方法可以接受第二个参数,如果第二个参数是true,那么query属性的部分,会将querystring的部分转为对象,方便我们存入数据库

// 将req.url方法的第二个参数设置为true  
var urlJson = url.parse(req.url,true);
console.log(urlJson);
res.end('');
/*
http://127.0.0.1:3000/wuwei/index.html?id=123&name=wuwei#456
打印的部分:
Url {
 ...
  search: '?id=123&name=wuwei',
  query: { id: '123', name: 'wuwei' },
  ...
}
*/


1.3.2 url.format 方法

format方法的参数就是 parse方法的结果对象, 用于将对象转为一个字符串

let str = url.format(
    {
        protocol: null,
        slashes: null,
        auth: null,
        host: null,
        port: null,
        hostname: null,
        hash: null,
        search: '?username=wuwei&password=123456',
        query: 'username=wuwei&password=123456',
        pathname: '/wuwei/index.html',
        path: '/wuwei/index.html?username=wuwei&password=123456',
        href: '/wuwei/index.html?username=wuwei&password=123456'
    }
)



console.log(str)
// 结果 /wuwei/index.html?username=wuwei&password=123456


1.3.3 url.resolve(from,to)

语法

​ url.resolve(from,to)

参数介绍

  1. from 参数为基准路径
  2. to 参数为参考路径

两个路径都可以是绝对路径,或者相对路径, 最后返回合并后的路径

用to替换from路径的最后一个文件夹

const {resolve} = require('url');

console.log(resolve('/usr/local','node'))
//返回  /usr/node

//带上斜杠
console.log(resolve('/usr/local/','node'));
//可以理解成
console.log(resolve('/usr/local/*','node'));
//返回  /usr/local/node

如果to带斜杠,如/node;

直接放回/node,因为斜杠表示根目录.

to是绝对路径,直接返回to,如果不是绝对路径就和from拼接,然后返回绝对路径.



另一套API

1.3.4 另一个则是通常使用在Web浏览器中,实现WHATWG URL Standard的API

WHARWG URL 是一套规范,规定url长什么样子

var url = require("url")
var u = "https://music.163.com:80/wuwei/index.html?id=123&name=qq/#/song";
console.log(new url.URL(u))

/*
URL {
  href:
   'https://music.163.com:80/wuwei/index.html?id=123&name=qq/#/song',
  origin: 'https://music.163.com:80',
  protocol: 'https:',
  username: '',
  password: '',
  host: 'music.163.com:80',
  hostname: 'music.163.com',
  port: '80',
  pathname: '/wuwei/index.html',
  search: '?id=123&name=qq/',
  searchParams: URLSearchParams { 'id' => '123', 'name' => 'qq/' },         // 参数对象
  hash: '#/song'
}
*/

scheme://host.domain:port/path/filename?queryName=queryValue

说明

  1. scheme: 定义因特网的类型.最常见的是 http,https,ftp
  2. host : 定义主机(http 默认主机是www)
  3. domain: 定义域名,比如 baidu.com
  4. :port : 定义主机上的端口号(http 默认的端口号是80)
  5. path : 定义服务器上的路径(如果省略/,则文档必须位于网站的根目录中)
  6. filename : 定义文档/资源的名称,比如 index.html
  7. queryName : 查询字符串,url 中携带的数据 如果username=admin


2. querystring 模块

querystring模块有一个parse方法和url.parse()加true非常相似,就是把query的字符串部分转为对象

2.1 parse 方法使用方法

parse方法是将字符串解析为对象

querystring模块的parse方法接受四个参数

语法

​ querystring.parse(str[,sep] [,eq] [,options])

参数介绍

  1. str 参数是必须的, 就是制定被转换的查询字符串
  2. seq 可选, 指定分割字符 默认为'&' 一般不用
  3. eq 可选 指定查询字符串中的分配字符,默认 '=' 一般也不用
  4. options 可选 是一个配置对象, 通过配置maxkeys来指定解析后对象属性的个数(一般不用)
const http = require('http');
const url = require('url');
const path = require('path');
const querystring = require('querystring')

// 创建一个服务器
http.createServer((req, res) => {
  // 将req.url转为对象
  var urlJson = url.parse(req.url)
  // 获取文件的路径
  var pathname = urlJson.pathname;
  // 获取文件的扩展名
  var extname = path.extname(pathname);
  // 获取查询字符串
  var qs = urlJson.query;
  // 将查询字符串转为对象,和url.parse()方法加true非常类似
  var queryjson = querystring.parse(qs)

  console.log(pathname);
  console.log(extname);
  console.log(qs);
  console.log(queryjson);
  res.end('');

}).listen(3000);
console.log("Server Start at 3000 port")

/*
http://127.0.0.1:3000/wuwei/index.html?id=123&name=wuwei#456

打印的部分:
/wuwei/index.html
.html
id=123&name=wuwei
{ id: '123', name: 'wuwei' }
*/

就会发现querystring和path模块都是服务于url模块的


2.2 stringify 方法

stringify 方法用于将对象转为特定的字符串拼接的方式

string方法,接受三个参数

语法

​ querystring.stringify(obj [,sep] [,eq])

参数介绍

  1. obj 必须 用于指定被转换的对象
  2. sep 可选 表示指定查询字符串中所使用的分割字符串, 默认为 & 一般不用
  3. eq 可选 用于指定查询字符串中使用的分配字符 默认为 = 一般不用


2.3 escape 方法

将中文以及其他符号转义

const querystring = require('querystring')

let str = querystring.escape("你好")

console.log(str);  // %E4%BD%A0%E5%A5%BD


2.4 unescape 方法

将转义后的字符反转义

const querystring = require('querystring')

let str = querystring.escape("%E4%BD%A0%E5%A5%BD")

console.log(str);  // 你好


3. path路径模块

NodeJs中,提供了一个path模块,在这个模块中,提供了许多实用的,可被用来处理与转换文件路径的方法及属性

用于格式化或拼接一个完整的路径

引入path模块

const path = require('path');

console.log(path)

path是一个对象


3.1. path常用 方法和属性
3.1.1 path.join()

这个方法主要用来拼接路径.返回相对路径\

拼接路由地址尽量使用join(‘ ’)方法,因为不同的操作系统会使用不同的连接符

作用:

将多个路径拼接成一个完成的路径

var path = require('path');
var p2 = "./wuwei/aa/index.html";
console.log(path.join("code", p2))

// 常用的
console.log(path.join(__dirname, p2))

这里使用了全局变量__dirname

全局变量

__dirname当前文件的所在文件夹的路径(绝对路径)

__filename当前运行的文件(当前文件的整体路劲)

console.log(path.join('a','b'));
//返回
a/b   //路径拼接

//可以接受多个参数

console.log(path.join('a','b','c'));
//返回
a/b/c   //路径拼接

//会自动识别
console.log(path.join('a','/b','/c'));
//返回
a/b/c   //路径拼接
console.log(path.join('a','./b','./c'));
//返回
a/b/c   //路径拼接

console.log(path.join('a','./b','..'));
a


3.1.2 path.resolve()

这个方法也是用来拼接路径的,但是返回的是绝对路径,尽量少用

console.log(path.resolve('a'))

//返回绝对路径
/Users/fy/Desktop/a

console.log(path.resolve(__dirname,'test'))



// 获取路径信息的一组

3.1.3 path.dirname()

返回路径中的文件夹部分

var path = require('path')
var p2 = "./wuwei/aa/index.html";
console.log(path.dirname(p2));    // ./wuwei/aa


3.1.4 path.basename()

返回路径中的文件部分(包含文件名和扩展名)

var path = require('path')
var p2 = "./wuwei/aa/index.html";
console.log(path.basename(p2))  // index.html


3.1.5 path.extname()

返回路径中的扩展名

var path = require('path')
var p2 = "./wuwei/aa/index.html";
console.log(path.extname(p2))     // .html



// 把路径拆分,已经合并路径的一组

3.1.6 path.parse()

解析路径: 返回包含路径各部分信息的对象

var path = require('path')
var p2 = "./wuwei/aa/index.html";
console.log(path.parse(p2));
/*
{ root: '',
  dir: './wuwei/aa',
  base: 'index.html',
  ext: '.html',
  name: 'index' }
*/

例子:

const http = require('http');
const fs = require('fs');
// 处理路径的url模块
const url = require('url');
// 处理文件路径工具的模块
const path = require('path');

// 创建一个服务器
http.createServer((req, res) => {
  // 将req.url转为对象
  var urlJson = url.parse(req.url, true)
  // 获取文件的路径
  var pathname = urlJson.pathname;
  // 获取文件的扩展名
  var extname = path.extname(pathname);
  console.log(pathname);
  console.log(extname)
  res.end('');

}).listen(3000);
console.log("Server Start at 3000 port")

/*
http://127.0.0.1:3000/wuwei/index.html?id=123&name=wuwei#456

打印的部分:
/wuwei/index.html
.html
*/

我们可以使用解构的方式来使用这些方法

const {join}  = require("path")

//这样解构后就可以直接使用
//join 来替代 path.json
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容