国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Koa v2.x 中文文檔 使用指南

anquan / 3065人閱讀

摘要:當(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

相關(guān)文章

  • Koa v2.x 中文文檔Koa v1.x 遷移到 v2.x

    摘要:一個(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. 新的中...

    fancyLuo 評(píng)論0 收藏0
  • Koa v2.x 中文文檔

    摘要:的對(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...

    Cobub 評(píng)論0 收藏0
  • Koa v2.x 中文文檔 Koa 對(duì)比 Express

    摘要:使用承諾和異步功能來(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)注更新...

    summerpxy 評(píng)論0 收藏0
  • Koa v2.x 中文文檔 常見(jiàn)問(wè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...

    Paul_King 評(píng)論0 收藏0
  • Koa v2.x 中文文檔 錯(cuò)誤處理

    摘要:但是,默認(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...

    zgbgx 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<