1胳徽、url網址解析
url.parse(url募闲,true,true)將url解析成json對象
第二個參數true可以把query屬性的值變?yōu)閷ο螅谌齻€true可以將不含協(xié)議(http或者https)的host解析出來虎锚。
image.png
url.format({})將json對象解析成url地址
url.resolve('http://baidu.com','/course/list')生成合法的url地址,第二個參數是路徑枚赡。
2拴还、QueryString
- 序列化字符串
querystring.stringify({name:'scott',course:['jade','node'],from:''})
返回一個字符串
'name=scott&course=jade&course=node&from='
第二個參數是連接符,默認是&鸦难,可以改為‘根吁,’第三個參數是key和value之間的連接符,默認是=合蔽,可以改為‘:’
- 反序列化
querystring.parse('name=scott&course=jade&course=node&from=')
返回一個對象
{name:'scott',
course:['jade','node'],
from:''}
第二個參數和第三個參數同stringify第四個參數是參數個數击敌,默認是1000個,通過把拴事。沃斤。。設為0就沒有限制了
- querystring.escape('')
轉義 - querystring.unesacpe('')
反轉義
3刃宵、http
域名解析過程
- 1衡瓶、 Chrome搜索自身的DNS緩存
- 2、 搜索操作系統(tǒng)自身的緩存(瀏覽器沒有找到緩存或者緩存已經失效)
- 3牲证、 讀取本地HOST文件
- 4哮针、瀏覽器發(fā)起一個DNS的一個系統(tǒng)調用
- 5、 瀏覽器獲得域名對應的IP地址后坦袍,發(fā)起HTTP三次握手十厢。
- 6、 TCP/IP連接建立后捂齐,瀏覽器就可以向服務器發(fā)送http請求了蛮放,比如說用http的get方法請求一個根域里的一個域名,協(xié)議可以采用http1.0的一個協(xié)議
-7奠宜、 服務端接收了這個請求包颁,根據路徑參數,經過后端的一些處理后压真,把處理后的一個結果的數據返回給瀏覽器娩嚼,如果是網頁頁面就會把整個個html代碼返回給瀏覽器 - 8、 瀏覽器拿到html頁面代碼后榴都,在解析和渲染這個頁面的時候待锈,里面的js、css嘴高、圖片靜態(tài)資源竿音,他們同樣也是一個個http請求和屎,都需要經過上面的步驟。
- 9春瞬、瀏覽器根據拿到的資源對頁面進行渲染柴信,最終把一個完整的頁面呈現給了用戶。
4宽气、回調随常、阻塞和非阻塞、異步和同步萄涯、單/多線程绪氛、I/O、事件驅動涝影、事件循環(huán)
- 回調是異步編程最基本的方法枣察,對nodejs來說需要按順序執(zhí)行異步邏輯的時候,通常采用后續(xù)傳遞的方式燃逻,也就是說序目,將后續(xù)邏輯封裝在回調函數中作為起始函數的參數。
- js是同步的伯襟,即是按代碼完成順序依次執(zhí)行猿涨,上一步沒有執(zhí)行完不能執(zhí)行下一個任務。異步就是不等上一個執(zhí)行完就執(zhí)行下一個任務姆怪,是異步的執(zhí)行順序叛赚,在js里的異步函數是setTimeout(callback,1000)和setInterval(callback,1000)
- 單線程就是按順序執(zhí)行片效,一次執(zhí)行某一段代碼红伦,執(zhí)行完后再執(zhí)行下一段代碼,多線程就是能不等上段代碼處理完就往下執(zhí)行淀衣。
- I/O 表示磁盤的寫入和讀出,在nodejs里為文件資源數據庫提供接口召调。向文件系統(tǒng)發(fā)送請求的時候不用等著硬盤膨桥,當硬盤準備好的時候非阻塞接口會通知到node
- 阻塞就是如果產生死循環(huán)了,不能往下執(zhí)行了就會發(fā)生阻塞唠叛。js可以通過回調函數的方式進行異步編程只嚣,達到非阻塞的效果
- 事件驅動就是監(jiān)聽事件,但不執(zhí)行艺沼,事件發(fā)生的時候執(zhí)行相應的操作(即回調函數)册舞。注冊回調即基于事件驅動的回調。
- 事件循環(huán)障般,倘若有大量的異步操作调鲸,eventloop回調函數隊列盛杰,當異步函數執(zhí)行的時候,回調函數就會壓入這個先進先出隊列藐石,對nodejs來說不斷查詢即供,當讀取到事件時,調用相應的回調函數于微。
5逗嫡、事件模塊
events,一個對象EventEmitter
支持多個監(jiān)聽器株依,不要超過十個(當然也可以修改)
var EventEmitter=require('events').EventEmitter;
var life=new EventEmitter();
life.setMaxListeners(11)//設置同名的name的最大監(jiān)聽函數的個數
life.on('name',callback)//綁定事件
life.emit('name',參數)//觸發(fā)事件,返回的是true或者false驱证,true代表有監(jiān)聽,即life.on()
life.removeListener('name',具名函數的名字)//移除事件恋腕,不能為匿名函數function(){}
life.removeAllListener()//批量移除
life.listeners('name')//查詢正在監(jiān)聽的name的函數抹锄,為數組
EventEmitter.listenerCounter(實例名life,事件名‘name’)//獲得某個時間的監(jiān)聽數量
6吗坚、http.request()
http.request(options[,callback])
options可以為對象祈远、字符串或者url,如果是字符串商源,會自動使用url.parse()解析车份,如果是url對象,默認轉換成options對象牡彻。
可選的參數callback回座位單次監(jiān)聽器被添加到‘response’事件扫沼。
使用 http.request() 必須總是調用 req.end() 來表明請求的結束,即使沒有數據被寫入請求主體庄吼。
7缎除、http.get()
http.get(options[, callback])
get請求不帶請求主體
參數和request一樣,唯一的區(qū)別是get自動調用req.end()