koa中間件原理

之前有寫過koa中間件的簡單使用娶眷,簡單回顧下:

//app.js
const   Koa = require('koa');
const   app = new Koa();
app.use(async (ctx, next) => {
    console.log(`${ctx.request.method} ${ctx.request.url}`); // 打印URL
    await next(); // 調(diào)用下一個middleware
});
app.use(async (ctx, next) => {
    const start = new Date().getTime(); // 當(dāng)前時間
    await next(); // 調(diào)用下一個middleware
    const ms = new Date().getTime() - start; // 耗費時間
    console.log(`Time: ${ms}ms`); // 打印耗費時間
});
app.use(async (ctx, next) => {
    await next();
    ctx.response.type = 'text/html';
    ctx.response.body = '<h1>Hello, koa2!</h1>';
});
app.listen(9091);

運行:

node app.js   //訪問localhost:9091

以上就是koa中間件的使用届宠,可以看出中間件的執(zhí)行時通過use注冊函數(shù)豌注。知道use里執(zhí)行中間件,構(gòu)造一個服務(wù)每聪,實現(xiàn)http訪問齿风。

//server.js
const http = require('http');
class Koa{
        createContent(req, res){
                const ctx = {
                      req, res
                }
                return ctx;
          }

        callback(){
              return (req, res)=>{
                  const ctx = this.createContent(req, res);
                  ctx.res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
                ctx.res.end("測試http服務(wù)");
            }
        }

        listen(port){
            const server = http.createServer(this.callback());
            server.listen(port);
        }
}
module.exports = Koa;

//app.js
const server = require('server.js');
const app = new server();
app.listen(9000);
node app.js  //執(zhí)行app, http訪問

服務(wù)核心use(中間件注冊)

//server.js
const http = require('http');

function compose(middlewares){
           return function(){
                        function dispatch(i){
                              const fn = middllwares[i];
                              try{
                                    return Promise.resolve(
                                            fn(ctx, dispatch.bind(null, i+1));
                                        );
                                }catch(err){
                                    return  Promise.reject(err);
                              }
                        }
                        dispatch(0);
          }
}

class myKoa{
        constructor(){
              this.middleware = [];
        }        
        use(fn){
              this.middleware.push(fn);
              return this;
        }
        createContent(req, res){
                const ctx = {
                      req, res
                }
                return ctx;
          }

        callback(){
              return (req, res)=>{
                  const ctx = this.createContent(req, res);
                  //ctx.res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
                  //ctx.res.end("測試http服務(wù)");
                  
            }
        }

        listen(port){
            const server = http.createServer(this.callback());
            server.listen(port);
        }
}
module.exports = myKoa;

//app.js
const Iok = require('./myKoa.js');
const app = new Iok();
  app.use(async (ctx, next) => {
      console.log('lllll');
      await next();
      ctx.res.end('444444444444');
  });

  app.use(async (ctx) => {
      console.log('222222222222');
      ctx.res.end('66666666666666');
  });
  app.listen(9000);

以上就是實現(xiàn)koa的核心

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市穷娱,隨后出現(xiàn)的幾起案子运沦,更是在濱河造成了極大的恐慌茶袒,老刑警劉巖梯刚,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薪寓,死亡現(xiàn)場離奇詭異向叉,居然都是意外死亡,警方通過查閱死者的電腦和手機瘦黑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門幸斥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咬扇,“玉大人懈贺,你說我怎么就攤上這事坡垫”疲” “怎么了配乱?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵宪卿,是天一觀的道長佑钾。 經(jīng)常有香客問我烦粒,道長,這世上最難降的妖魔是什么兽掰? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任孽尽,我火速辦了婚禮杉女,結(jié)果婚禮上鸳吸,老公的妹妹穿的比我還像新娘晌砾。我一直安慰自己,他們只是感情好哼勇,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布积担。 她就那樣靜靜地躺著楣嘁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聋溜。 梳的紋絲不亂的頭發(fā)上撮躁,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天把曼,我揣著相機與錄音,去河邊找鬼注盈。 笑死叙赚,一個胖子當(dāng)著我的面吹牛震叮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尉间,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哲嘲,長吁一口氣:“原來是場噩夢啊……” “哼损话!你這毒婦竟也來了光涂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤炼吴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了殴瘦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡灌旧,死狀恐怖羡玛,靈堂內(nèi)的尸體忽然破棺而出让歼,到底是詐尸還是另有隱情补箍,我是刑警寧澤裹粤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布霉翔,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弟疆。R本人自食惡果不足惜柑司,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剥纷。 院中可真熱鬧,春花似錦蹲缠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祭埂。三九已至掘譬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睦焕,已是汗流浹背本谜。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工乌助, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陌知,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親籽腕。 傳聞我的和親對象是個殘疾皇子纸俭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本節(jié)將結(jié)合例子和源碼對koa2的中間件機制做一介紹郎楼。 什么是中間件窒悔? 中間件的本質(zhì)就是一種在特定場景下使用的函數(shù)简珠,...
    空無一碼閱讀 1,445評論 0 2
  • 閱讀這篇文章聋庵,你不需要聽過 koa 框架,你甚至不需要使用過 node祭玉,你只需簡單看懂 js。相信每一個具有 we...
    大前端藝術(shù)家閱讀 1,458評論 0 4
  • Node 主要用在開發(fā) Web 應(yīng)用岛都,koa 是目前 node 里最流行的 web 框架臼疫。 在 Node 開啟一個...
    中間件閱讀 510評論 0 1
  • 一扣孟、背景 Koa 是一個新的 web 框架哈打,由 Express 幕后的原班人馬打造讯壶, 致力于成為 web 應(yīng)用和 ...
    bayi_lzp閱讀 10,516評論 6 26
  • 晚上十點伏蚊,周拿出鑰匙,打開門氛改,屋內(nèi)漆黑一片,他摸黑開了燈疆导,脫掉衣服和鞋襪葛躏,摘下面具,釋放被束縛了一天的身體败富。 屋內(nèi)...
    虛空恒樂閱讀 411評論 3 14