這篇文章主要介紹了Koa框架中間件怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供宜良網(wǎng)站建設(shè)、宜良做網(wǎng)站、宜良網(wǎng)站設(shè)計(jì)、宜良網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、宜良企業(yè)網(wǎng)站模板建站服務(wù),10年宜良做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
Node 主要用在開發(fā) Web 應(yīng)用,koa 是目前 node 里最流行的 web 框架。
在 Node 開啟一個(gè) http 服務(wù)簡(jiǎn)直易如反掌,官網(wǎng) demo。
const http = require("http"); const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader("Content-Type", "text/plain"); res.end("Hello World\n"); }); const hostname = "127.0.0.1"; const port = 3000; server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
引入 http 模塊, http 的 createServer 方法創(chuàng)建了一個(gè) http.Server 的實(shí)例。
server 監(jiān)聽 3000 端口。
我們傳入到 createServer 里的函數(shù)實(shí)際是監(jiān)聽 request 事件的回調(diào),每當(dāng)請(qǐng)求進(jìn)來(lái),監(jiān)聽函數(shù)就會(huì)執(zhí)行。
request 事件的監(jiān)聽函數(shù),其函數(shù)接受兩個(gè)參數(shù),分別是 req 和 res 。其中 req 是一個(gè)可讀流, res 是一個(gè)可寫流。我們通過(guò) req 獲取 http 請(qǐng)求的所有信息,同時(shí)將數(shù)據(jù)寫入到 res 來(lái)對(duì)該請(qǐng)求作出響應(yīng)。
koa 應(yīng)用
koa 如何創(chuàng)建一個(gè) server, 直接上個(gè)官網(wǎng)的例子
const Koa = require("koa"); const app = new Koa(); // x-response-time app.use(async (ctx, next) => { const start = Date.now(); await next(); const ms = Date.now() - start; ctx.set("X-Response-Time", `${ms}ms`); }); // logger app.use(async (ctx, next) => { const start = Date.now(); await next(); const ms = Date.now() - start; console.log(`${ctx.method} ${ctx.url} - ${ms}`); }); // response app.use(async ctx => { ctx.body = "Hello World"; }); app.listen(3000);
中間件概念在編程中使用廣泛, 不管是前端還是后端, 在實(shí)際編程中或者框架設(shè)計(jì)都有使用到這種實(shí)用的模型。
基本上,Koa 所有的功能都是通過(guò)中間件實(shí)現(xiàn)的。
每個(gè)中間件默認(rèn)接受兩個(gè)參數(shù),第一個(gè)參數(shù)是 Context 對(duì)象,第二個(gè)參數(shù)是 next 函數(shù)。只要調(diào)用 next 函數(shù),就可以把執(zhí)行權(quán)轉(zhuǎn)交給下一個(gè)中間件。
如果中間件內(nèi)部沒有調(diào)用 next 函數(shù),那么執(zhí)行權(quán)就不會(huì)傳遞下去。
多個(gè)中間件會(huì)形成一個(gè)棧結(jié)構(gòu)(middle stack),以“先進(jìn)后出”(first-in-last-out)的順序執(zhí)行。整個(gè)過(guò)程就像,先是入棧,然后出棧的操作。
上面代碼的執(zhí)行順序是:
請(qǐng)求 ==> x-response-time 中間件 ==> logger 中間件 ==> response中間件 ==> logger 中間件 ==> response-time 中間件 ==> 響應(yīng)
理解 Koa 的中間件機(jī)制(源碼分析)
閱讀源碼,化繁為簡(jiǎn),我們看看 koa 的中間件系統(tǒng)是如何實(shí)現(xiàn)的。
class Application extends Emitter { constructor() { super(); this.middleware = []; }, use(fn) { this.middleware.push(fn); return this; }, callback() { const fn = compose(this.middleware); return function(req, res) { return fn(ctx); }; }, listen(...args) { const server = http.createServer(this.callback()); return server.listen(...args); } }
好了,精簡(jiǎn)結(jié)束,一不小心,去枝末節(jié),最后只剩下不到 20 行代碼。
這就是框架的核心,簡(jiǎn)化后的代碼非常清晰,有點(diǎn)不可思議,但核心就是這么簡(jiǎn)單。
我們先分析以上代碼做了什么事。
我們定義了一個(gè) middleware 數(shù)組來(lái)存儲(chǔ)中間件。
我們定一個(gè)了一個(gè) use 方法來(lái)注冊(cè)一個(gè)中間件。其實(shí)就是簡(jiǎn)單的 push 到自身的 mideware 這個(gè)數(shù)組中。
我們還使用了一個(gè) compose 方法,傳入 middleware ,應(yīng)該是做了一些處理,返回了一個(gè)可執(zhí)行的方法。
你一定對(duì)中間的 compose 方法很好奇,初此之外的代碼都容易理解,唯獨(dú)這個(gè) compose 不太知道究竟做了什么。
其實(shí), compose 就是整個(gè)中間件框架的核心。
compose 之外,代碼已經(jīng)很清楚的定義了
中間件的存儲(chǔ)
中間件的注冊(cè)
而 compose 方法做了最為重要的一件事
中間件的執(zhí)行
核心源碼 compose
先上碼
function compose(middleware) { return function(context, next) { // last called middleware # let index = -1; return dispatch(0); function dispatch(i) { if (i <= index) return Promise.reject(new Error("next() called multiple times")); index = i; let fn = middleware[i]; if (i === middleware.length) fn = next; if (!fn) return Promise.resolve(); try { return Promise.resolve(fn(context, dispatch.bind(null, i + 1))); } catch (err) { return Promise.reject(err); } } }; }
我試圖去簡(jiǎn)化一下這個(gè)方法,但方法本身已經(jīng)足夠簡(jiǎn)潔。
代碼很簡(jiǎn)潔。
通過(guò) next()傳遞 實(shí)現(xiàn)中間件調(diào)用, 結(jié)合 Promise 采用 遞歸調(diào)用 的通知機(jī)制。
看圖
這種形式的控制流讓整個(gè) Koa 框架中間件的訪問呈現(xiàn)出 自上而下的中間件流 + 自下而上的 response 數(shù)據(jù)流 的形式。
Koa 本身做的工作僅僅是定制了中間件的編寫規(guī)范,而不內(nèi)置任何中間件。一個(gè) web request 會(huì)通過(guò) Koa 的中間件棧,來(lái)動(dòng)態(tài)完成 response 的處理。
koa 在中間件語(yǔ)法上面采用了 async + await 語(yǔ)法來(lái)生成 Promise 形式的程序控制流。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Koa框架中間件怎么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!