摘要:用法回顧執(zhí)行順序每當(dāng)執(zhí)行時(shí),執(zhí)行下一個(gè)中間件,執(zhí)行到最后一個(gè)中間件后開(kāi)始往回執(zhí)行源碼解析源碼執(zhí)行步驟使用方法即將進(jìn)中的數(shù)組中方法調(diào)用的和方法來(lái)創(chuàng)建服務(wù),的回掉執(zhí)行下面的操作回掉首先執(zhí)行方法將組合成一個(gè)對(duì)象來(lái)執(zhí)行,這個(gè)對(duì)象即可完成中
用法回顧
const Koa = require("koa"); const app = new Koa(); app.use(async (ctx, next) => { fn1(); await next(); fn2(); }); app.use(async (ctx, next) => { fn3(); await next(); fn4() }); app.use(async (ctx, next) => { fn5(); await next(); fn6() }); app.listen(3000);
執(zhí)行順序 fn1 -> fn3 -> fn5 -> fn6 -> fn4 -> fn2
每當(dāng)執(zhí)行next時(shí),執(zhí)行下一個(gè)中間件,執(zhí)行到最后一個(gè)中間件后開(kāi)始往回執(zhí)行
使用use方法即將middleware push 進(jìn)koa中的this.middleware數(shù)組中
listen方法調(diào)用node的http.createServer和server.listen方法來(lái)創(chuàng)建服務(wù),createServer的回掉執(zhí)行下面的操作
回掉首先執(zhí)行compose(this.middleware)方法將middleware組合成一個(gè)promise對(duì)象來(lái)執(zhí)行,這個(gè)promise對(duì)象即可完成中間件級(jí)聯(lián)的操作
將回掉傳出的值req和res用于創(chuàng)建一個(gè)context對(duì)象,里面包含了request對(duì)象和response對(duì)象,這些對(duì)象提供了許多后臺(tái)開(kāi)發(fā)需要的參數(shù)和方法
執(zhí)行中間件
得到結(jié)果給respond方法格式化數(shù)據(jù)
或者捕獲異常給onerror方法處理異常
composekoa源碼最重要的部分,如何實(shí)現(xiàn)中間件級(jí)聯(lián),以下是compose方法的源碼(為方便觀看,部分進(jìn)行了ES6處理)
function compose (middleware) { if (!Array.isArray(middleware)) throw new TypeError("Middleware stack must be an array!") for (const fn of middleware) { if (typeof fn !== "function") throw new TypeError("Middleware must be composed of functions!") } 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 // next = undefined if (!fn) return Promise.resolve() // 當(dāng)運(yùn)行到最后一個(gè)middleware時(shí)結(jié)束 try { return Promise.resolve( fn(context, next = () => dispatch(i + 1)) ) } catch (err) { return Promise.reject(err) } } } }
compose方法使用遞歸的方式遍歷每一個(gè)middleware
遍歷時(shí)將下一個(gè)middleware當(dāng)作next傳遞給當(dāng)前的middleware
更多文章 yjy5264.github.io文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94172.html
摘要:中異步處理在中使用的是,在中使用的是,我們本次采用來(lái)處理異步。函數(shù)參數(shù)為的數(shù)組,數(shù)組成員是通過(guò)方法添加的中間件。小結(jié)從最開(kāi)始的編寫(xiě)中間件,到現(xiàn)在閱讀函數(shù)源碼,中間件機(jī)制并不復(fù)雜,了解之后,我們可以運(yùn)用編寫(xiě)更合適的中間件,構(gòu)建自己的應(yīng)用。 上一篇講了如何編寫(xiě)屬于自己的 Koa 中間件,本篇將根據(jù)原理實(shí)現(xiàn)一個(gè)簡(jiǎn)單的中間件處理函數(shù),并對(duì) Koa 中間件處理函數(shù) compose 函數(shù)進(jìn)行源碼解...
摘要:若大于時(shí),將賦予,此時(shí)與相等。通過(guò)源碼分析,我們知道了的核心思想建立于中間件機(jī)制,它是一個(gè)設(shè)計(jì)十分簡(jiǎn)潔巧妙的框架,擴(kuò)展性極強(qiáng),就是建立于之上的上層框架。 Koa是一款設(shè)計(jì)優(yōu)雅的輕量級(jí)Node.js框架,它主要提供了一套巧妙的中間件機(jī)制與簡(jiǎn)練的API封裝,因此源碼閱讀起來(lái)也十分輕松,不論你從事前端或是后端研發(fā),相信都會(huì)有所收獲。 目錄結(jié)構(gòu) 首先將源碼下載到本地,可以看到Koa的源碼只包含...
摘要:實(shí)現(xiàn)的四大模塊上文簡(jiǎn)述了源碼的大體框架結(jié)構(gòu),接下來(lái)我們來(lái)實(shí)現(xiàn)一個(gè)的框架,筆者認(rèn)為理解和實(shí)現(xiàn)一個(gè)框架需要實(shí)現(xiàn)四個(gè)大模塊,分別是封裝創(chuàng)建類構(gòu)造函數(shù)構(gòu)造對(duì)象中間件機(jī)制和剝洋蔥模型的實(shí)現(xiàn)錯(cuò)誤捕獲和錯(cuò)誤處理下面我們就逐一分析和實(shí)現(xiàn)。 什么是koa框架? ? ? ? ?koa是一個(gè)基于node實(shí)現(xiàn)的一個(gè)新的web框架,它是由express框架的原班人馬打造的。它的特點(diǎn)是優(yōu)雅、簡(jiǎn)潔、表達(dá)力強(qiáng)、自由度...
摘要:實(shí)現(xiàn)的四大模塊上文簡(jiǎn)述了源碼的大體框架結(jié)構(gòu),接下來(lái)我們來(lái)實(shí)現(xiàn)一個(gè)的框架,筆者認(rèn)為理解和實(shí)現(xiàn)一個(gè)框架需要實(shí)現(xiàn)四個(gè)大模塊,分別是封裝創(chuàng)建類構(gòu)造函數(shù)構(gòu)造對(duì)象中間件機(jī)制和剝洋蔥模型的實(shí)現(xiàn)錯(cuò)誤捕獲和錯(cuò)誤處理下面我們就逐一分析和實(shí)現(xiàn)。 什么是koa框架? ? ? ? ?koa是一個(gè)基于node實(shí)現(xiàn)的一個(gè)新的web框架,它是由express框架的原班人馬打造的。它的特點(diǎn)是優(yōu)雅、簡(jiǎn)潔、表達(dá)力強(qiáng)、自由度...
閱讀 3868·2021-07-28 18:10
閱讀 2577·2019-08-30 15:44
閱讀 1083·2019-08-30 14:07
閱讀 3455·2019-08-29 17:20
閱讀 1577·2019-08-26 18:35
閱讀 3533·2019-08-26 13:42
閱讀 1816·2019-08-26 11:58
閱讀 1585·2019-08-23 18:33