Koa v2.x 中文文件 API

DemoPark發表於2019-02-16

此係列文章的應用示例已釋出於 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進或 Star 關注更新. 歡迎 Star.

相關 API

安裝

Koa 依賴 node v7.6.0 或 ES2015及更高版本和 async 方法支援.

你可以使用自己喜歡的版本管理器快速安裝支援的 node 版本:

$ nvm install 7
$ npm i koa
$ node my-koa-app.js

使用 Babel 實現 Async 方法

要在 node < 7.6 版本的 Koa 中使用 async 方法, 我們推薦使用 babel`s require hook.

require(`babel-register`);
// 應用的其餘 require 需要被放到 hook 後面
const app = require(`./app`);

要解析和編譯 async 方法, 你至少應該有 transform-async-to-generator
transform-async-to-module-method 外掛.

例如, 在你的 .babelrc 檔案中, 你應該有:

{
  "plugins": ["transform-async-to-generator"]
}

你也可以用 env preset 的 target 引數 "node": "current" 替代.

應用程式

Koa 應用程式是一個包含一組中介軟體函式的物件,它是按照類似堆疊的方式組織和執行的。
Koa 類似於你可能遇到過的許多其他中介軟體系統,例如 Ruby 的 Rack ,Connect 等,然而,一個關鍵的設計點是在其低階中介軟體層中提供高階“語法糖”。 這提高了互操作性,穩健性,並使書寫中介軟體更加愉快。

這包括諸如內容協商,快取清理,代理支援和重定向等常見任務的方法。 儘管提供了相當多的有用的方法 Koa 仍保持了一個很小的體積,因為沒有捆綁中介軟體。

必修的 hello world 應用:

const Koa = require(`koa`);
const app = new Koa();

app.use(async ctx => {
  ctx.body = `Hello World`;
});

app.listen(3000);

級聯

Koa 中介軟體以更傳統的方式級聯,您可能習慣使用類似的工具 – 之前難以讓使用者友好地使用 node 的回撥。然而,使用 async 功能,我們可以實現 “真實” 的中介軟體。對比 Connect 的實現,通過一系列功能直接傳遞控制,直到一個返回,Koa 呼叫“下游”,然後控制流回“上游”。

下面以 “Hello World” 的響應作為示例,首先請求流通過 x-response-timelogging 中介軟體來請求何時開始,然後繼續移交控制給 response 中介軟體。當一箇中介軟體呼叫 next() 則該函式暫停並將控制傳遞給定義的下一個中介軟體。當在下游沒有更多的中介軟體執行後,堆疊將展開並且每個中介軟體恢復執行其上游行為。

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

設定

應用程式設定是 app 例項上的屬性,目前支援如下:

  • app.env 預設是 NODE_ENV 或 “development”
  • app.proxy 當真正的代理頭欄位將被信任時
  • app.subdomainOffset 對於要忽略的 .subdomains 偏移[2]

app.listen(…)

Koa 應用程式不是 HTTP 伺服器的1對1展現。
可以將一個或多個 Koa 應用程式安裝在一起以形成具有單個HTTP伺服器的更大應用程式。

建立並返回 HTTP 伺服器,將給定的引數傳遞給 Server#listen()。這些內容都記錄在 nodejs.org.

以下是一個無作用的 Koa 應用程式被繫結到 3000 埠:

const Koa = require(`koa`);
const app = new Koa();
app.listen(3000);

這裡的 app.listen(...) 方法只是以下方法的語法糖:

const http = require(`http`);
const Koa = require(`koa`);
const app = new Koa();
http.createServer(app.callback()).listen(3000);

這意味著您可以將同一個應用程式同時作為 HTTP 和 HTTPS 或多個地址:

const http = require(`http`);
const https = require(`https`);
const Koa = require(`koa`);
const app = new Koa();
http.createServer(app.callback()).listen(3000);
https.createServer(app.callback()).listen(3001);

app.callback()

返回適用於 http.createServer() 方法的回撥函式來處理請求。你也可以使用此回撥函式將 koa 應用程式掛載到 Connect/Express 應用程式中。

app.use(function)

將給定的中介軟體方法新增到此應用程式。參閱 Middleware 獲取更多資訊.

app.keys=

設定簽名的 Cookie 金鑰。

這些被傳遞給 KeyGrip,但是你也可以傳遞你自己的 KeyGrip 例項。

例如,以下是可以接受的:

app.keys = [`im a newer secret`, `i like turtle`];
app.keys = new KeyGrip([`im a newer secret`, `i like turtle`], `sha256`);

這些金鑰可以倒換,並在使用 { signed: true } 引數簽名 Cookie 時使用。

ctx.cookies.set(`name`, `tobi`, { signed: true });

app.context

app.context 是從其建立 ctx 的原型。您可以通過編輯 app.contextctx 新增其他屬性。這對於將 ctx 新增到整個應用程式中使用的屬性或方法非常有用,這可能會更加有效(不需要中介軟體)和/或 更簡單(更少的 require()),而更多地依賴於ctx,這可以被認為是一種反模式。

例如,要從 ctx 新增對資料庫的引用:

app.context.db = db();

app.use(async ctx => {
  console.log(ctx.db);
});

注意:

  • ctx 上的許多屬性都是使用 gettersetterObject.defineProperty() 定義的。你只能通過在 app.context 上使用 Object.defineProperty() 來編輯這些屬性(不推薦)。查閱 https://github.com/koajs/koa/…
  • 安裝的應用程式目前使用其父級的 ctx 和設定。 因此,安裝的應用程式只是一組中介軟體。

錯誤處理

預設情況下,將所有錯誤輸出到 stderr,除非 app.silenttrue
err.status404err.exposetrue 時預設錯誤處理程式也不會輸出錯誤。
要執行自定義錯誤處理邏輯,如集中式日誌記錄,您可以新增一個 “error” 事件偵聽器:

app.on(`error`, err => {
  log.error(`server error`, err)
});

如果 req/res 期間出現錯誤,並且 無法 響應客戶端,Context例項仍然被傳遞:

app.on(`error`, (err, ctx) => {
  log.error(`server error`, err, ctx)
});

當發生錯誤 並且 仍然可以響應客戶端時,也沒有資料被寫入 socket 中,Koa 將用一個 500 “內部伺服器錯誤” 進行適當的響應。在任一情況下,為了記錄目的,都會發出應用級 “錯誤”。

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

相關文章