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ù)介紹
- urlStr 必須 用于指定需要轉(zhuǎn)化的URL 字符串
- 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ù)介紹
- from 參數(shù)為基準(zhǔn)路徑
- 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ō)明
- scheme: 定義因特網(wǎng)的類(lèi)型.最常見(jiàn)的是 http,https,ftp
- host : 定義主機(jī)(http 默認(rèn)主機(jī)是www)
- domain: 定義域名,比如 baidu.com
- :port : 定義主機(jī)上的端口號(hào)(http 默認(rèn)的端口號(hào)是80)
- path : 定義服務(wù)器上的路徑(如果省略/,則文檔必須位于網(wǎng)站的根目錄中)
- filename : 定義文檔/資源的名稱(chēng),比如 index.html
- 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ù)介紹
- str 參數(shù)是必須的, 就是制定被轉(zhuǎn)換的查詢(xún)字符串
- seq 可選, 指定分割字符 默認(rèn)為'&' 一般不用
- eq 可選 指定查詢(xún)字符串中的分配字符,默認(rèn) '=' 一般也不用
- 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ù)介紹
- obj 必須 用于指定被轉(zhuǎn)換的對(duì)象
- sep 可選 表示指定查詢(xún)字符串中所使用的分割字符串, 默認(rèn)為 & 一般不用
- 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