成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

anquan / 3068人閱讀

摘要:當中間件運行時,它必須手動調(diào)用來運行下游中間件。例如,這個中間件從讀取文件名,然后在將給指定合并結(jié)果之前并行讀取每個文件的內(nèi)容。當你無法控制中間件的名稱時,這很有用。

指南

此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進或 Star 關(guān)注更新. 歡迎 Star.

本指南涵蓋的 Koa 主題不與 API 直接相關(guān),例如編寫中間件的最佳做法和應(yīng)用程序結(jié)構(gòu)建議。在這些例子中,我們使用 async 函數(shù)作為中間件 - 您也可以使用 commonFunction 或generatorFunction,這將些所不同。

編寫中間件

Koa 中間件是簡單的函數(shù),它返回一個帶有簽名 (ctx, next) 的MiddlewareFunction。當中間件運行時,它必須手動調(diào)用 next() 來運行 “下游” 中間件。

例如,如果你想要跟蹤通過添加 X-Response-Time 頭字段通過 Koa 傳播請求需要多長時間,則中間件將如下所示:

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);

如果您是前端開發(fā)人員,您可以將 next(); 之前的任意代碼視為“捕獲”階段,這個簡易的 gif 說明了 async 函數(shù)如何使我們能夠恰當?shù)乩枚褩A鱽韺崿F(xiàn)請求和響應(yīng)流:

創(chuàng)建一個跟蹤響應(yīng)時間的日期

等待下一個中間件的控制

創(chuàng)建另一個日期跟蹤持續(xù)時間

等待下一個中間件的控制

將響應(yīng)主體設(shè)置為“Hello World”

計算持續(xù)時間

輸出日志行

計算響應(yīng)時間

設(shè)置 X-Response-Time 頭字段

交給 Koa 處理響應(yīng)

接下來,我們將介紹創(chuàng)建 Koa 中間件的最佳做法。

中間件最佳實踐

本節(jié)介紹中間件創(chuàng)作最佳實踐,例如中間件接受參數(shù),命名中間件進行調(diào)試等等。

中間件參數(shù)

當創(chuàng)建公共中間件時,將中間件包裝在接受參數(shù)的函數(shù)中,遵循這個約定是有用的,允許用戶擴展功能。即使您的中間件 接受任何參數(shù),這仍然是保持統(tǒng)一的好方法。

這里我們設(shè)計的 logger 中間件接受一個 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)試中分配名稱很有用。

function logger(format) {
  return async function logger(ctx, next) {

  };
}
將多個中間件與 koa-compose 相結(jié)合

有時您想要將多個中間件 “組合” 成一個單一的中間件,便于重用或?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)請求,并希望繞過下游中間件可以簡單地省略 next()。通常這將在路由中間件中,但這也可以任意執(zhí)行。例如,以下內(nèi)容將以 “two” 進行響應(yīng),但是所有三個都將被執(zhí)行,從而使下游的 “three” 中間件有機會操縱響應(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");
});

以下配置在第二個中間件中省略了next(),并且仍然會以 “two” 進行響應(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";
  console.log("<< two");
});

app.use(async function (ctx, next) {
  console.log(">> three");
  await next();
  console.log("<< three");
});

當最遠的下游中間件執(zhí)行 next(); 時,它實際上是一個 noop 函數(shù),允許中間件在堆棧中的任意位置正確組合。

異步操作

Async 方法和 promise 來自 Koa 的底層,可以讓你編寫非阻塞序列代碼。例如,這個中間件從 ./docs 讀取文件名,然后在將給 body 指定合并結(jié)果之前并行讀取每個 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)建庫,支持來自 debug 的 DEBUG 環(huán)境變量,它提供簡單的條件記錄。

例如,要查看所有 koa 特定的調(diào)試信息,只需通過 DEBUG=koa*,并且在啟動時,您將看到所使用的中間件的列表。

$ 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 在運行時沒有定義函數(shù)名,你也可以將中間件的名稱設(shè)置為 ._name。當你無法控制中間件的名稱時,這很有用。例如:

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)試時不只會看到 “serve”,你也會看到:
Now, instead of just seeing "serve" when debugging, you will see:

  koa:application use static /public +0ms

如果這篇文章對您有幫助, 感謝 下方點贊 或 Star GitHub: koa-docs-Zh-CN 支持, 謝謝.

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89495.html

相關(guān)文章

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

    摘要:一個遷移方式是逐個更新它們。刪除特定的日志記錄行為對于環(huán)境的顯式檢查從錯誤處理中刪除。直接或它不再使用并已廢棄。支持仍然支持分支,但應(yīng)該不會得到功能性更新。除了此遷移指南外,文檔將針對最新版本。 從 Koa v1.x 遷移到 v2.x 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進或 Star 關(guān)注更新. 歡迎 Star. 新的中...

    fancyLuo 評論0 收藏0
  • Koa v2.x 中文文檔

    摘要:的對象提供了用于處理響應(yīng)的方法,該響應(yīng)委托給。應(yīng)用對象是與的服務(wù)器和處理中間件注冊的接口,從發(fā)送到中間件,默認錯誤處理,以及上下文,請求和響應(yīng)對象的配置。 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進或 Star 關(guān)注更新. 歡迎 Star. showImg(https://segmentfault.com/img/bVNQYf...

    Cobub 評論0 收藏0
  • Koa v2.x 中文文檔 Koa 對比 Express

    摘要:使用承諾和異步功能來擺脫回調(diào)地獄的應(yīng)用程序,并簡化錯誤處理。它暴露了自己的和對象,而不是的和對象。因此,可被視為的模塊的抽象,其中是的應(yīng)用程序框架。這使得中間件對于整個堆棧而言不僅僅是最終應(yīng)用程序代碼,而且更易于書寫,并更不容易出錯。 Koa 與 Express 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進或 Star 關(guān)注更新...

    summerpxy 評論0 收藏0
  • Koa v2.x 中文文檔 常見問題

    摘要:常見問題此系列文章的應(yīng)用示例已發(fā)布于可以幫助改進或關(guān)注更新歡迎替代它更像是,但是很多的好東西被轉(zhuǎn)移到的中間件級別,以幫助形成更強大的基礎(chǔ)。這使得中間件對于整個堆棧而言不僅僅是最終應(yīng)用程序代碼,而且更易于書寫,并更不容易出錯。 常見問題 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進或 Star 關(guān)注更新. 歡迎 Star. Koa...

    Paul_King 評論0 收藏0
  • Koa v2.x 中文文檔 錯誤處理

    摘要:但是,默認錯誤處理程序?qū)τ诖蠖鄶?shù)用例來說都是足夠好的。錯誤偵聽器接收所有中間件鏈返回的錯誤,如果一個錯誤被捕獲并且不再拋出,它將不會被傳遞給錯誤偵聽器。 錯誤處理 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進或 Star 關(guān)注更新. 歡迎 Star. Try-Catch 使用 async 方法意味著你可以 try-catch n...

    zgbgx 評論0 收藏0

發(fā)表評論

0條評論

anquan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<