第七節(jié): 內(nèi)置模塊(三): url模塊與path模塊

1. url模塊

1.1. url的了解

url就是全球統(tǒng)一資源定位符
對(duì)網(wǎng)站資源的一種簡(jiǎn)潔表達(dá)形式,也稱(chēng)為網(wǎng)址


1.2. url的構(gòu)成(重中之重)

一個(gè)url是一個(gè)結(jié)構(gòu)化的字符串,他包含多個(gè)有意義的組成部分,當(dāng)被解析時(shí),會(huì)返回一個(gè)url對(duì)象


完整結(jié)構(gòu)

協(xié)議://用戶名:密碼@主機(jī)名.名.域:端口號(hào)/目錄名/文件名.擴(kuò)展名?參數(shù)名=參數(shù)值#hash


http協(xié)議URL常見(jiàn)結(jié)構(gòu)

協(xié)議://主機(jī)名.名.域/目錄名/文件名.擴(kuò)展名?參數(shù)名=參數(shù)值&參數(shù)名2=參數(shù)值2#hash


在通過(guò)req.url來(lái)獲取完整url內(nèi)容時(shí),獲取是包含queryString

例如:

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

此時(shí)通過(guò)req.url, 獲取的值為/index.html?id=123

也就是說(shuō)querystring是屬于req.url,但是hash不屬于

但是我們此時(shí)要得到文件名的部分,我不想要querystring,此時(shí)可以用正則提煉,但是太麻煩了

因此Node給我們提供了內(nèi)置的模塊,url,path,querystring他們都可以服務(wù)于URL的識(shí)別


1.3. url模塊

url模塊提供了一些使用的函數(shù),用于URL路徑的處理與解析

要注意的是Node提供了兩套不同API處理URL

先看一下舊API


1.3.1 url.parse 方法

parse方法,可以將req.url轉(zhuǎn)成對(duì)象形式

語(yǔ)法

? url.parse(urlStr [, parseQueryString])

參數(shù)介紹

  1. urlStr 必須 用于指定需要轉(zhuǎn)化的URL 字符串
  2. parseQueryString 可選, 參數(shù)是一個(gè)布爾值, true表示將querystring轉(zhuǎn)為對(duì)象, false, 不轉(zhuǎn)為對(duì)象就是一個(gè)普通的查詢(xún)字符串,默認(rèn)值為false

使用示例

const http = require('http');
// 處理路徑的url模塊
const url = require('url');

// 創(chuàng)建一個(gè)服務(wù)器
http.createServer((req, res) => {
  // 將req.url轉(zhuǎn)為對(duì)象
  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' 
 }
*/



同時(shí)url.parse方法可以接受第二個(gè)參數(shù),如果第二個(gè)參數(shù)是true,那么query屬性的部分,會(huì)將querystring的部分轉(zhuǎn)為對(duì)象,方便我們存入數(shù)據(jù)庫(kù)

// 將req.url方法的第二個(gè)參數(shù)設(shè)置為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方法的參數(shù)就是 parse方法的結(jié)果對(duì)象, 用于將對(duì)象轉(zhuǎn)為一個(gè)字符串

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)
// 結(jié)果 /wuwei/index.html?username=wuwei&password=123456


1.3.3 url.resolve(from,to)

語(yǔ)法

? url.resolve(from,to)

參數(shù)介紹

  1. from 參數(shù)為基準(zhǔn)路徑
  2. to 參數(shù)為參考路徑

兩個(gè)路徑都可以是絕對(duì)路徑,或者相對(duì)路徑, 最后返回合并后的路徑

用to替換from路徑的最后一個(gè)文件夾

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,因?yàn)樾备鼙硎靖夸?

to是絕對(duì)路徑,直接返回to,如果不是絕對(duì)路徑就和from拼接,然后返回絕對(duì)路徑.



另一套API

1.3.4 另一個(gè)則是通常使用在Web瀏覽器中,實(shí)現(xiàn)WHATWG URL Standard的API

WHARWG URL 是一套規(guī)范,規(guī)定url長(zhǎng)什么樣子

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/' },         // 參數(shù)對(duì)象
  hash: '#/song'
}
*/

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

說(shuō)明

  1. scheme: 定義因特網(wǎng)的類(lèi)型.最常見(jiàn)的是 http,https,ftp
  2. host : 定義主機(jī)(http 默認(rèn)主機(jī)是www)
  3. domain: 定義域名,比如 baidu.com
  4. :port : 定義主機(jī)上的端口號(hào)(http 默認(rèn)的端口號(hào)是80)
  5. path : 定義服務(wù)器上的路徑(如果省略/,則文檔必須位于網(wǎng)站的根目錄中)
  6. filename : 定義文檔/資源的名稱(chēng),比如 index.html
  7. queryName : 查詢(xún)字符串,url 中攜帶的數(shù)據(jù) 如果username=admin


2. querystring 模塊

querystring模塊有一個(gè)parse方法和url.parse()加true非常相似,就是把query的字符串部分轉(zhuǎn)為對(duì)象

2.1 parse 方法使用方法

parse方法是將字符串解析為對(duì)象

querystring模塊的parse方法接受四個(gè)參數(shù)

語(yǔ)法

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

參數(shù)介紹

  1. str 參數(shù)是必須的, 就是制定被轉(zhuǎn)換的查詢(xún)字符串
  2. seq 可選, 指定分割字符 默認(rèn)為'&' 一般不用
  3. eq 可選 指定查詢(xún)字符串中的分配字符,默認(rèn) '=' 一般也不用
  4. options 可選 是一個(gè)配置對(duì)象, 通過(guò)配置maxkeys來(lái)指定解析后對(duì)象屬性的個(gè)數(shù)(一般不用)
const http = require('http');
const url = require('url');
const path = require('path');
const querystring = require('querystring')

// 創(chuàng)建一個(gè)服務(wù)器
http.createServer((req, res) => {
  // 將req.url轉(zhuǎn)為對(duì)象
  var urlJson = url.parse(req.url)
  // 獲取文件的路徑
  var pathname = urlJson.pathname;
  // 獲取文件的擴(kuò)展名
  var extname = path.extname(pathname);
  // 獲取查詢(xún)字符串
  var qs = urlJson.query;
  // 將查詢(xún)字符串轉(zhuǎn)為對(duì)象,和url.parse()方法加true非常類(lèi)似
  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' }
*/

就會(huì)發(fā)現(xiàn)querystring和path模塊都是服務(wù)于url模塊的


2.2 stringify 方法

stringify 方法用于將對(duì)象轉(zhuǎn)為特定的字符串拼接的方式

string方法,接受三個(gè)參數(shù)

語(yǔ)法

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

參數(shù)介紹

  1. obj 必須 用于指定被轉(zhuǎn)換的對(duì)象
  2. sep 可選 表示指定查詢(xún)字符串中所使用的分割字符串, 默認(rèn)為 & 一般不用
  3. eq 可選 用于指定查詢(xún)字符串中使用的分配字符 默認(rèn)為 = 一般不用


2.3 escape 方法

將中文以及其他符號(hào)轉(zhuǎn)義

const querystring = require('querystring')

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

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


2.4 unescape 方法

將轉(zhuǎn)義后的字符反轉(zhuǎn)義

const querystring = require('querystring')

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

console.log(str);  // 你好


3. path路徑模塊

NodeJs中,提供了一個(gè)path模塊,在這個(gè)模塊中,提供了許多實(shí)用的,可被用來(lái)處理與轉(zhuǎn)換文件路徑的方法及屬性

用于格式化或拼接一個(gè)完整的路徑

引入path模塊

const path = require('path');

console.log(path)

path是一個(gè)對(duì)象


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

這個(gè)方法主要用來(lái)拼接路徑.返回相對(duì)路徑\

拼接路由地址盡量使用join(‘ ’)方法,因?yàn)椴煌牟僮飨到y(tǒng)會(huì)使用不同的連接符

作用:

將多個(gè)路徑拼接成一個(gè)完成的路徑

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

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

這里使用了全局變量__dirname

全局變量

__dirname當(dāng)前文件的所在文件夾的路徑(絕對(duì)路徑)

__filename當(dāng)前運(yùn)行的文件(當(dāng)前文件的整體路勁)

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

//可以接受多個(gè)參數(shù)

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

//會(huì)自動(dòng)識(shí)別
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()

這個(gè)方法也是用來(lái)拼接路徑的,但是返回的是絕對(duì)路徑,盡量少用

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

//返回絕對(duì)路徑
/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()

返回路徑中的文件部分(包含文件名和擴(kuò)展名)

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


3.1.5 path.extname()

返回路徑中的擴(kuò)展名

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



// 把路徑拆分,已經(jīng)合并路徑的一組

3.1.6 path.parse()

解析路徑: 返回包含路徑各部分信息的對(duì)象

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');

// 創(chuàng)建一個(gè)服務(wù)器
http.createServer((req, res) => {
  // 將req.url轉(zhuǎn)為對(duì)象
  var urlJson = url.parse(req.url, true)
  // 獲取文件的路徑
  var pathname = urlJson.pathname;
  // 獲取文件的擴(kuò)展名
  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
*/

我們可以使用解構(gòu)的方式來(lái)使用這些方法

const {join}  = require("path")

//這樣解構(gòu)后就可以直接使用
//join 來(lái)替代 path.json
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容