此係列文章的應用示例已釋出於 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.message
與 response.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 將會自動設定狀態為 200
或 204
。
String
Content-Type 預設為 text/html
或 text/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)
設定響應標頭 field
到 value
:
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 支援, 謝謝.