express 框架的簡(jiǎn)易實(shí)現(xiàn)

簡(jiǎn)易源碼

 
let http=require('http');
let url=require('url');
function createAppAplication(){
    let appRoutes=[];//路由
    const methods=http.METHODS; //所有網(wǎng)絡(luò)請(qǐng)求方法
    let app=(req,res)=>{
        

        let index=0;
        function next(error){
            if(index===appRoutes.length)
            {
                res.end(`can not ${methodName} ${pathname}`);
                return;
    
            }
            let methodName=req.method.toLowerCase();
            let {pathname}=url.parse(req.url,true);
            let {method,path,handler}=appRoutes[index++];
            //如果中間件右報(bào)錯(cuò)信息
            if(error)
            {
                console.log('處理報(bào)錯(cuò)');
                console.log(handler);
                if(handler.length===4)
                {
                    handler(error,res,req,next)
                }
                else{
                    next(error);
                }
                return;
            }
          
           
            //如果是中間件
            if(method==='middle')
            {
                // 
                if(path==='/' || path===pathname || pathname.startsWith(path))
                {
                    handler(req,res,next);
                }
                else{
                    next();
                }

            }
            else{
                if((method===methodName|| method==='all') && (path===pathname || path==='*'))
                 {
                         handler(req,res);
                         return;
                 }
                 else{
                     //沒(méi)有匹配到接著匹配
                     next();
                 }

            }
            
    
    
        }

        next();
    
        //  //獲取當(dāng)前請(qǐng)求方法
        //   let methodName=req.method.toLowerCase();
        //   //獲取請(qǐng)求路徑 依賴(lài) url 模塊
        //   let {pathname}=url.parse(req.url,true);

        //   for(let {method,path,handler} of appRoutes)
        //   {
        //         if(method===methodName && path===pathname)
        //         {
        //               handler(req,res);
        //               return;
        //         }
        //   }
        //   //都沒(méi)有匹配到
        //   res.end(`can not ${methodName} ${pathname}`);
   
           



    }
   
    /**
     * 收集中間件
     */
    app.use=function(path,handler){
        if(typeof path ==='function')
        {
            handler=path;
            path='/';
        }

        appRoutes.push({
            method:'middle',
            path,
            handler,
        })

    }
    //內(nèi)置中間件 獲得請(qǐng)求信息

    app.use(function(req,res,next){
        let {pathname,query}=url.parse(req.url,true);
        let hostname=req.headers['host'].split(':')[0];
        req.pathname=pathname;
        req.query=query;
        req.hostname=hostname;
        next();

    })

 
   //配置 app.get 等
    methods.forEach((method)=>{
        
        //獲得都是大寫(xiě)的 轉(zhuǎn)為小寫(xiě)
        method=method.toLowerCase();
       
        app[method]=(path,handler)=>{
            let item={
                 method,
                 path,
                 handler
            }
            //console.log(item);
            appRoutes.push(item);
           
        } 
        


    })

    //所有請(qǐng)求都配匹配到

    app.all=function(path,handler){
         appRoutes.push({
               method:'all',
               path,
               handler,
         })
    }

    //端口監(jiān)聽(tīng)
    app.listen=function(){
          let server=http.createServer(app);
          server.listen(...arguments);
    }
    return app;

    

}
module.exports=createAppAplication;

測(cè)試

 
const express=require('./express');
let app=express();
app.use(function(req,res,next){
      //設(shè)置請(qǐng)求頭
      res.setHeader('Content-Type','text/html;charset=utf-8');
      next();
})
app.use('/name',function(req,res,next){
    //設(shè)置請(qǐng)求頭
    console.log('進(jìn)入name的 中間件');
  
  //  next("報(bào)錯(cuò)中間件");
  next();
})

app.get('/name',(req,res)=>{
    let {pathname,hostname,query}=req;
    let message={
        pathname,
        hostname,
        query
    }
    res.end(`請(qǐng)求信息:${JSON.stringify(message)}: 返回結(jié)果:于學(xué)文`);

})
app.get('/age',(req,res)=>{
    res.end('27');

})

app.use((error,req,res,next)=>{
    next(error);
      
})
app.use((error,req,res,next)=>{
    console.log(error);
})

app.listen(3000,()=>{
      console.log('監(jiān)聽(tīng)30010端口');
}) 
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末择份,一起剝皮案震驚了整個(gè)濱河市栅炒,隨后出現(xiàn)的幾起案子香浩,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異梆靖,居然都是意外死亡控汉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)返吻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姑子,“玉大人,你說(shuō)我怎么就攤上這事测僵〗钟樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵捍靠,是天一觀(guān)的道長(zhǎng)舆乔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)剂公,這世上最難降的妖魔是什么希俩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纲辽,結(jié)果婚禮上颜武,老公的妹妹穿的比我還像新娘。我一直安慰自己拖吼,他們只是感情好鳞上,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吊档,像睡著了一般篙议。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怠硼,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天鬼贱,我揣著相機(jī)與錄音,去河邊找鬼香璃。 笑死这难,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葡秒。 我是一名探鬼主播姻乓,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼眯牧!你這毒婦竟也來(lái)了蹋岩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤学少,失蹤者是張志新(化名)和其女友劉穎剪个,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旱易,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禁偎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年腿堤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片如暖。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笆檀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盒至,到底是詐尸還是另有隱情酗洒,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布枷遂,位于F島的核電站樱衷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酒唉。R本人自食惡果不足惜矩桂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痪伦。 院中可真熱鬧侄榴,春花似錦、人聲如沸网沾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辉哥。三九已至桦山,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醋旦,已是汗流浹背恒水。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浑度,地道東北人寇窑。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓鸦概,卻偏偏與公主長(zhǎng)得像箩张,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窗市,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354