摘要:當(dāng)中間件運(yùn)行時(shí),它必須手動(dòng)調(diào)用來(lái)運(yùn)行下游中間件。例如,這個(gè)中間件從讀取文件名,然后在將給指定合并結(jié)果之前并行讀取每個(gè)文件的內(nèi)容。當(dāng)你無(wú)法控制中間件的名稱(chēng)時(shí),這很有用。
指南
此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新. 歡迎 Star.
本指南涵蓋的 Koa 主題不與 API 直接相關(guān),例如編寫(xiě)中間件的最佳做法和應(yīng)用程序結(jié)構(gòu)建議。在這些例子中,我們使用 async 函數(shù)作為中間件 - 您也可以使用 commonFunction 或generatorFunction,這將些所不同。
編寫(xiě)中間件Koa 中間件是簡(jiǎn)單的函數(shù),它返回一個(gè)帶有簽名 (ctx, next) 的MiddlewareFunction。當(dāng)中間件運(yùn)行時(shí),它必須手動(dòng)調(diào)用 next() 來(lái)運(yùn)行 “下游” 中間件。
例如,如果你想要跟蹤通過(guò)添加 X-Response-Time 頭字段通過(guò) Koa 傳播請(qǐng)求需要多長(zhǎng)時(shí)間,則中間件將如下所示:
async function responseTime(ctx, next) { const start = Date.now(); await next(); const ms = Date.now() - start; ctx.set("X-Response-Time", `${ms}ms`); } app.use(responseTime);
如果您是前端開(kāi)發(fā)人員,您可以將 next(); 之前的任意代碼視為“捕獲”階段,這個(gè)簡(jiǎn)易的 gif 說(shuō)明了 async 函數(shù)如何使我們能夠恰當(dāng)?shù)乩枚褩A鱽?lái)實(shí)現(xiàn)請(qǐng)求和響應(yīng)流:
創(chuàng)建一個(gè)跟蹤響應(yīng)時(shí)間的日期
等待下一個(gè)中間件的控制
創(chuàng)建另一個(gè)日期跟蹤持續(xù)時(shí)間
等待下一個(gè)中間件的控制
將響應(yīng)主體設(shè)置為“Hello World”
計(jì)算持續(xù)時(shí)間
輸出日志行
計(jì)算響應(yīng)時(shí)間
設(shè)置 X-Response-Time 頭字段
交給 Koa 處理響應(yīng)
接下來(lái),我們將介紹創(chuàng)建 Koa 中間件的最佳做法。
中間件最佳實(shí)踐本節(jié)介紹中間件創(chuàng)作最佳實(shí)踐,例如中間件接受參數(shù),命名中間件進(jìn)行調(diào)試等等。
中間件參數(shù)當(dāng)創(chuàng)建公共中間件時(shí),將中間件包裝在接受參數(shù)的函數(shù)中,遵循這個(gè)約定是有用的,允許用戶(hù)擴(kuò)展功能。即使您的中間件 不 接受任何參數(shù),這仍然是保持統(tǒng)一的好方法。
這里我們?cè)O(shè)計(jì)的 logger 中間件接受一個(gè) format 自定義字符串,并返回中間件本身:
function logger(format) { format = format || ":method ":url""; return async function (ctx, next) { const str = format .replace(":method", ctx.method) .replace(":url", ctx.url); console.log(str); await next(); }; } app.use(logger()); app.use(logger(":method :url"));命名中間件
命名中間件是可選的,但是在調(diào)試中分配名稱(chēng)很有用。
function logger(format) { return async function logger(ctx, next) { }; }將多個(gè)中間件與 koa-compose 相結(jié)合
有時(shí)您想要將多個(gè)中間件 “組合” 成一個(gè)單一的中間件,便于重用或?qū)С?。你可以使?koa-compose
const compose = require("koa-compose"); async function random(ctx, next) { if ("/random" == ctx.path) { ctx.body = Math.floor(Math.random() * 10); } else { await next(); } }; async function backwards(ctx, next) { if ("/backwards" == ctx.path) { ctx.body = "sdrawkcab"; } else { await next(); } } async function pi(ctx, next) { if ("/pi" == ctx.path) { ctx.body = String(Math.PI); } else { await next(); } } const all = compose([random, backwards, pi]); app.use(all);響應(yīng)中間件
中間件決定響應(yīng)請(qǐng)求,并希望繞過(guò)下游中間件可以簡(jiǎn)單地省略 next()。通常這將在路由中間件中,但這也可以任意執(zhí)行。例如,以下內(nèi)容將以 “two” 進(jìn)行響應(yīng),但是所有三個(gè)都將被執(zhí)行,從而使下游的 “three” 中間件有機(jī)會(huì)操縱響應(yīng)。
app.use(async function (ctx, next) { console.log(">> one"); await next(); console.log("<< one"); }); app.use(async function (ctx, next) { console.log(">> two"); ctx.body = "two"; await next(); console.log("<< two"); }); app.use(async function (ctx, next) { console.log(">> three"); await next(); console.log("<< three"); });
以下配置在第二個(gè)中間件中省略了next(),并且仍然會(huì)以 “two” 進(jìn)行響應(yīng),然而,第三個(gè)(以及任何其他下游中間件)將被忽略:
app.use(async function (ctx, next) { console.log(">> one"); await next(); console.log("<< one"); }); app.use(async function (ctx, next) { console.log(">> two"); ctx.body = "two"; console.log("<< two"); }); app.use(async function (ctx, next) { console.log(">> three"); await next(); console.log("<< three"); });
當(dāng)最遠(yuǎn)的下游中間件執(zhí)行 next(); 時(shí),它實(shí)際上是一個(gè) noop 函數(shù),允許中間件在堆棧中的任意位置正確組合。
異步操作Async 方法和 promise 來(lái)自 Koa 的底層,可以讓你編寫(xiě)非阻塞序列代碼。例如,這個(gè)中間件從 ./docs 讀取文件名,然后在將給 body 指定合并結(jié)果之前并行讀取每個(gè) markdown 文件的內(nèi)容。
const fs = require("fs-promise"); app.use(async function (ctx, next) { const paths = await fs.readdir("docs"); const files = await Promise.all(paths.map(path => fs.readFile(`docs/${path}`, "utf8"))); ctx.type = "markdown"; ctx.body = files.join(""); });調(diào)試 Koa
Koa 以及許多構(gòu)建庫(kù),支持來(lái)自 debug 的 DEBUG 環(huán)境變量,它提供簡(jiǎn)單的條件記錄。
例如,要查看所有 koa 特定的調(diào)試信息,只需通過(guò) DEBUG=koa*,并且在啟動(dòng)時(shí),您將看到所使用的中間件的列表。
$ DEBUG=koa* node --harmony examples/simple koa:application use responseTime +0ms koa:application use logger +4ms koa:application use contentLength +0ms koa:application use notfound +0ms koa:application use response +0ms koa:application listen +0ms
由于 JavaScript 在運(yùn)行時(shí)沒(méi)有定義函數(shù)名,你也可以將中間件的名稱(chēng)設(shè)置為 ._name。當(dāng)你無(wú)法控制中間件的名稱(chēng)時(shí),這很有用。例如:
const path = require("path"); const serve = require("koa-static"); const publicFiles = serve(path.join(__dirname, "public")); publicFiles._name = "static /public"; app.use(publicFiles);
現(xiàn)在,在調(diào)試時(shí)不只會(huì)看到 “serve”,你也會(huì)看到:
Now, instead of just seeing "serve" when debugging, you will see:
koa:application use static /public +0ms
如果這篇文章對(duì)您有幫助, 感謝 下方點(diǎn)贊 或 Star GitHub: koa-docs-Zh-CN 支持, 謝謝.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89495.html
摘要:一個(gè)遷移方式是逐個(gè)更新它們。刪除特定的日志記錄行為對(duì)于環(huán)境的顯式檢查從錯(cuò)誤處理中刪除。直接或它不再使用并已廢棄。支持仍然支持分支,但應(yīng)該不會(huì)得到功能性更新。除了此遷移指南外,文檔將針對(duì)最新版本。 從 Koa v1.x 遷移到 v2.x 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新. 歡迎 Star. 新的中...
摘要:的對(duì)象提供了用于處理響應(yīng)的方法,該響應(yīng)委托給。應(yīng)用對(duì)象是與的服務(wù)器和處理中間件注冊(cè)的接口,從發(fā)送到中間件,默認(rèn)錯(cuò)誤處理,以及上下文,請(qǐng)求和響應(yīng)對(duì)象的配置。 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新. 歡迎 Star. showImg(https://segmentfault.com/img/bVNQYf...
摘要:使用承諾和異步功能來(lái)擺脫回調(diào)地獄的應(yīng)用程序,并簡(jiǎn)化錯(cuò)誤處理。它暴露了自己的和對(duì)象,而不是的和對(duì)象。因此,可被視為的模塊的抽象,其中是的應(yīng)用程序框架。這使得中間件對(duì)于整個(gè)堆棧而言不僅僅是最終應(yīng)用程序代碼,而且更易于書(shū)寫(xiě),并更不容易出錯(cuò)。 Koa 與 Express 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新...
摘要:常見(jiàn)問(wèn)題此系列文章的應(yīng)用示例已發(fā)布于可以幫助改進(jìn)或關(guān)注更新歡迎替代它更像是,但是很多的好東西被轉(zhuǎn)移到的中間件級(jí)別,以幫助形成更強(qiáng)大的基礎(chǔ)。這使得中間件對(duì)于整個(gè)堆棧而言不僅僅是最終應(yīng)用程序代碼,而且更易于書(shū)寫(xiě),并更不容易出錯(cuò)。 常見(jiàn)問(wèn)題 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新. 歡迎 Star. Koa...
摘要:但是,默認(rèn)錯(cuò)誤處理程序?qū)τ诖蠖鄶?shù)用例來(lái)說(shuō)都是足夠好的。錯(cuò)誤偵聽(tīng)器接收所有中間件鏈返回的錯(cuò)誤,如果一個(gè)錯(cuò)誤被捕獲并且不再拋出,它將不會(huì)被傳遞給錯(cuò)誤偵聽(tīng)器。 錯(cuò)誤處理 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新. 歡迎 Star. Try-Catch 使用 async 方法意味著你可以 try-catch n...
閱讀 1793·2023-04-26 01:44
閱讀 1219·2021-11-12 10:34
閱讀 1603·2021-09-09 09:33
閱讀 1738·2019-08-30 15:44
閱讀 2899·2019-08-30 13:49
閱讀 2196·2019-08-29 15:26
閱讀 951·2019-08-26 13:30
閱讀 1417·2019-08-23 18:15