Koa v2.x 中文文件 響應(Response)

DemoPark發表於2019-02-16

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

響應(Response)

Koa Response 物件是在 node 的 vanilla 響應物件之上的抽象,提供了諸多對 HTTP 伺服器開發有用的功能。

API

response.header

響應標頭物件。

response.headers

響應標頭物件。別名是 response.header

response.socket

請求套接字。

response.status

獲取響應狀態。預設情況下,response.status 設定為 404 而不是像 node 的 res.statusCode 那樣預設為 200

response.status=

通過數字程式碼設定響應狀態:

  • 100 “continue”
  • 101 “switching protocols”
  • 102 “processing”
  • 200 “ok”
  • 201 “created”
  • 202 “accepted”
  • 203 “non-authoritative information”
  • 204 “no content”
  • 205 “reset content”
  • 206 “partial content”
  • 207 “multi-status”
  • 208 “already reported”
  • 226 “im used”
  • 300 “multiple choices”
  • 301 “moved permanently”
  • 302 “found”
  • 303 “see other”
  • 304 “not modified”
  • 305 “use proxy”
  • 307 “temporary redirect”
  • 308 “permanent redirect”
  • 400 “bad request”
  • 401 “unauthorized”
  • 402 “payment required”
  • 403 “forbidden”
  • 404 “not found”
  • 405 “method not allowed”
  • 406 “not acceptable”
  • 407 “proxy authentication required”
  • 408 “request timeout”
  • 409 “conflict”
  • 410 “gone”
  • 411 “length required”
  • 412 “precondition failed”
  • 413 “payload too large”
  • 414 “uri too long”
  • 415 “unsupported media type”
  • 416 “range not satisfiable”
  • 417 “expectation failed”
  • 418 “I`m a teapot”
  • 422 “unprocessable entity”
  • 423 “locked”
  • 424 “failed dependency”
  • 426 “upgrade required”
  • 428 “precondition required”
  • 429 “too many requests”
  • 431 “request header fields too large”
  • 500 “internal server error”
  • 501 “not implemented”
  • 502 “bad gateway”
  • 503 “service unavailable”
  • 504 “gateway timeout”
  • 505 “http version not supported”
  • 506 “variant also negotiates”
  • 507 “insufficient storage”
  • 508 “loop detected”
  • 510 “not extended”
  • 511 “network authentication required”

__注意__: 不用太在意記住這些字串, 如果你寫錯了,可以查閱這個列表隨時更正.

response.message

獲取響應的狀態訊息. 預設情況下, response.messageresponse.status 關聯.

response.message=

將響應的狀態訊息設定為給定值。

response.length=

將響應的 Content-Length 設定為給定值。

response.length

以數字返回響應的 Content-Length,或者從ctx.body推匯出來,或者undefined

response.body

獲取響應主體。

response.body=

將響應體設定為以下之一:

  • string 寫入
  • Buffer 寫入
  • Stream 管道
  • Object || Array JSON-字串化
  • null 無內容響應

如果 response.status 未被設定, Koa 將會自動設定狀態為 200204

String

Content-Type 預設為 text/htmltext/plain, 同時預設字符集是 utf-8。Content-Length 欄位也是如此。

Buffer

Content-Type 預設為 application/octet-stream, 並且 Content-Length 欄位也是如此。

Stream

Content-Type 預設為 application/octet-stream

每當流被設定為響應主體時,.onerror 作為偵聽器自動新增到 error 事件中以捕獲任何錯誤。此外,每當請求關閉(甚至過早)時,流都將被銷燬。如果你不想要這兩個功能,請勿直接將流設為主體。例如,當將主體設定為代理中的 HTTP 流時,你可能不想要這樣做,因為它會破壞底層連線。

參閱: https://github.com/koajs/koa/… 獲取更多資訊。

以下是流錯誤處理的示例,而不會自動破壞流:

const PassThrough = require(`stream`).PassThrough;

app.use(async ctx => {
  ctx.body = someHTTPStream.on(`error`, ctx.onerror).pipe(PassThrough());
});

Object

Content-Type 預設為 application/json. 這包括普通的物件 { foo: `bar` } 和陣列 [`foo`, `bar`]

response.get(field)

不區分大小寫獲取響應標頭欄位值 field

const etag = ctx.response.get(`ETag`);

response.set(field, value)

設定響應標頭 fieldvalue:

ctx.set(`Cache-Control`, `no-cache`);

response.append(field, value)

用值 val 附加額外的標頭 field

ctx.append(`Link`, `<http://127.0.0.1/>`);

response.set(fields)

用一個物件設定多個響應標頭fields:

ctx.set({
  `Etag`: `1234`,
  `Last-Modified`: date
});

response.remove(field)

刪除標頭 field

response.type

獲取響應 Content-Type 不含引數 “charset”。

const ct = ctx.type;
// => "image/png"

response.type=

設定響應 Content-Type 通過 mime 字串或副檔名。

ctx.type = `text/plain; charset=utf-8`;
ctx.type = `image/png`;
ctx.type = `.png`;
ctx.type = `png`;

注意: 在適當的情況下為你選擇 charset, 比如 response.type = `html` 將預設是 “utf-8”. 如果你想覆蓋 charset, 使用 ctx.set(`Content-Type`, `text/html`) 將響應頭欄位設定為直接值。

response.is(types…)

非常類似 ctx.request.is(). 檢查響應型別是否是所提供的型別之一。這對於建立操縱響應的中介軟體特別有用。

例如, 這是一箇中介軟體,可以削減除流之外的所有HTML響應。

const minify = require(`html-minifier`);

app.use(async (ctx, next) => {
  await next();

  if (!ctx.response.is(`html`)) return;

  let body = ctx.body;
  if (!body || body.pipe) return;

  if (Buffer.isBuffer(body)) body = body.toString();
  ctx.body = minify(body);
});

response.redirect(url, [alt])

執行 [302] 重定向到 url.

字串 “back” 是特別提供Referrer支援的,當Referrer不存在時,使用 alt 或“/”。

ctx.redirect(`back`);
ctx.redirect(`back`, `/index.html`);
ctx.redirect(`/login`);
ctx.redirect(`http://google.com`);

要更改 “302” 的預設狀態,只需在該呼叫之前或之後分配狀態。要變更主體請在此呼叫之後:

ctx.status = 301;
ctx.redirect(`/cart`);
ctx.body = `Redirecting to shopping cart`;

response.attachment([filename])

Content-Disposition 設定為 “附件” 以指示客戶端提示下載。(可選)指定下載的 filename

response.headerSent

檢查是否已經傳送了一個響應頭。 用於檢視客戶端是否可能會收到錯誤通知。

response.lastModified

Last-Modified 標頭返回為 Date, 如果存在。

response.lastModified=

Last-Modified 標頭設定為適當的 UTC 字串。您可以將其設定為 Date 或日期字串。

ctx.response.lastModified = new Date();

response.etag=

設定包含 " 包裹的 ETag 響應,
請注意,沒有相應的 response.etag getter。

ctx.response.etag = crypto.createHash(`md5`).update(ctx.body).digest(`hex`);

response.vary(field)

field 上變化。

response.flushHeaders()

重新整理任何設定的標頭,並開始主體。

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

相關文章