框架流程

一箫攀、瀏覽器發(fā)送請(qǐng)求

1、用戶輸入網(wǎng)址
http://127.0.0.1/
2违崇、瀏覽器根據(jù)請(qǐng)求轉(zhuǎn)變HTTP的請(qǐng)求包
GET / HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

二阿弃、服務(wù)器接收到請(qǐng)求

1诊霹、http模塊里實(shí)例化的server對(duì)象,server對(duì)象監(jiān)聽每一次瀏覽器發(fā)送過來的請(qǐng)求恤浪,每次的請(qǐng)求都會(huì)觸發(fā)request事件
this.server.on("request",(req,res)=>{})
2畅哑、將HTTP的請(qǐng)求包轉(zhuǎn)換成req的請(qǐng)求對(duì)象,并且傳入到請(qǐng)求事件觸發(fā)的函數(shù)中水由。
3荠呐、會(huì)創(chuàng)建生成一個(gè)res響應(yīng)對(duì)象,這個(gè)對(duì)象可以幫助我們快速的實(shí)現(xiàn)HTTP的響應(yīng)砂客。

三泥张、解析請(qǐng)求路徑,調(diào)用不同的頁面渲染函數(shù)

1鞠值、正則匹配方式進(jìn)行對(duì)路徑的匹配媚创。
2、以匹配的正則字符串作為KEY彤恶,找到需要調(diào)用執(zhí)行的渲染函數(shù)
//循環(huán)匹配正則路徑
for(let key in this.reqEvent){
    let regStr = key
    let reg = new RegExp(regStr,'igs');
    if(reg.test(req.url)){
        this.reqEvent[key](req,res);
        resState = true
        break;
    }
}
3钞钙、調(diào)用頁面的執(zhí)行函數(shù),執(zhí)行模板渲染
app.on('/movies/[01]',(req,res)=>{}) //這里的箭頭函數(shù)即為真正匹配到的頁面執(zhí)行的函數(shù)
4声离、調(diào)用模板的渲染函數(shù)
res.render(movies[index],'./template/index1.html')
5芒炼、執(zhí)行渲染函數(shù)
function render(options,path) {
    fs.readFile(path,{encoding:"utf-8",flag:"r"},(err,data)=>{
        if(err){
            console.log(err)
        }else{
            try{
                data = replaceArr(data,options)
                data = replaceVar(data,options)
            }catch(error){
                console.log(error)
            }
            this.end(data)
            
        }
    })
}
6、數(shù)組變量的替換
function replaceArr(data,options){
    //匹配循環(huán)的變量,并且替換循環(huán)的內(nèi)容
    let reg = /\{\%for \{(.*?)\} \%\}(.*?)\{\%endfor\%\}/igs
    while(result = reg.exec(data)){
        let strKey = result[1].trim();//提取變量時(shí)术徊,去掉左右兩邊的空格
        //通過key值獲取數(shù)組的內(nèi)容
        let strValueArr = options[strKey]
        let listStr = ""
        strValueArr.forEach((item,i) => {
            //替換每一項(xiàng)內(nèi)容里的變量
            listStr = listStr + replaceVar(result[2],{"item":item})
        });
        data = data.replace(result[0],listStr)
    }
    return data
}
7本刽、單個(gè)變量的替換
function replaceVar(data,options) {
    //匹配普通的變量,并且替換內(nèi)容
    let reg = /\{\{(.*?)\}\}/igs
    let result;
    while (result = reg.exec(data)){
        //去除兩邊的空白
        let strKey = result[1].trim();
        //options.item
        let strValue = eval('options.'+strKey);//執(zhí)行字符串作為JS表達(dá)式,并將計(jì)算出來的結(jié)果返回
        data = data.replace(result[0],strValue)
    }
    return data
}

四赠涮、如果是請(qǐng)求靜態(tài)文件子寓,那么就按照靜態(tài)文件的形式輸出

1、首先判斷是否響應(yīng)過,如果沒有響應(yīng)過笋除,可以判斷是否為靜態(tài)文件斜友,如果是靜態(tài)文件就正常的輸出
2、否則就輸出404
if(!resState){
    try{
        if(pathObj.dir==this.staticDir){
                res.setHeader("content-type",this.getContentType(pathObj.ext))
                let rs = fs.createReadStream('./static/'+pathObj.base)
                rs.pipe(res)
        }else{
            res.setHeader("content-type","text/html;charset=utf-8")
            res.end("<h1>404!頁面找不到</h1>")
        }
    }catch(error){
        console.log(error)
    }
}

五垃它、RES響應(yīng)對(duì)象將res設(shè)置的內(nèi)容最終轉(zhuǎn)化成http的響應(yīng)包

HTTP/1.1 200 OK
content-type: text/html;charset=utf-8
Date: Thu, 23 Jul 2020 12:17:19 GMT
Connection: keep-alive
Content-Length: 53

正文內(nèi)容

六鲜屏、瀏覽器解析響應(yīng)包,并將html渲染在頁面上

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗤瞎,一起剝皮案震驚了整個(gè)濱河市墙歪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贝奇,老刑警劉巖虹菲,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掉瞳,居然都是意外死亡毕源,警方通過查閱死者的電腦和手機(jī)浪漠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霎褐,“玉大人址愿,你說我怎么就攤上這事《沉В” “怎么了响谓?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長省艳。 經(jīng)常有香客問我娘纷,道長,這世上最難降的妖魔是什么跋炕? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任赖晶,我火速辦了婚禮,結(jié)果婚禮上辐烂,老公的妹妹穿的比我還像新娘遏插。我一直安慰自己,他們只是感情好纠修,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布胳嘲。 她就那樣靜靜地躺著,像睡著了一般分瘾。 火紅的嫁衣襯著肌膚如雪胎围。 梳的紋絲不亂的頭發(fā)上吁系,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天德召,我揣著相機(jī)與錄音,去河邊找鬼汽纤。 笑死上岗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕴坪。 我是一名探鬼主播肴掷,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼背传!你這毒婦竟也來了呆瞻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤径玖,失蹤者是張志新(化名)和其女友劉穎痴脾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梳星,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赞赖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年滚朵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片前域。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辕近,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匿垄,到底是詐尸還是另有隱情移宅,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布椿疗,位于F島的核電站吞杭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏变丧。R本人自食惡果不足惜芽狗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痒蓬。 院中可真熱鬧童擎,春花似錦、人聲如沸攻晒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲁捏。三九已至芯砸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間给梅,已是汗流浹背假丧。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留动羽,地道東北人包帚。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像运吓,于是被迫代替她去往敵國和親渴邦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350