Koa Response 對象是在 node 的 vanilla 響應(yīng)對象之上的抽象,提供了諸多對 HTTP 服務(wù)器開發(fā)有用的功能。
響應(yīng)標頭對象。
響應(yīng)標頭對象。別名是 response.header。
響應(yīng)套接字。 作為 request.socket 指向 net.Socket 實例。
獲取響應(yīng)狀態(tài)。默認情況下,response.status 設(shè)置為 404 而不是像 node 的 res.statusCode 那樣默認為 200。
通過數(shù)字代碼設(shè)置響應(yīng)狀態(tài):
注意: 不用太在意記住這些字符串, 如果你寫錯了,可以查閱這個列表隨時更正.
獲取響應(yīng)的狀態(tài)消息. 默認情況下, response.message 與 response.status 關(guān)聯(lián).
將響應(yīng)的狀態(tài)消息設(shè)置為給定值。
將響應(yīng)的 Content-Length 設(shè)置為給定值。
以數(shù)字返回響應(yīng)的 Content-Length,或者從ctx.body推導(dǎo)出來,或者undefined。
獲取響應(yīng)主體。
將響應(yīng)體設(shè)置為以下之一:
如果 response.status 未被設(shè)置, Koa 將會自動設(shè)置狀態(tài)為 200 或 204。
Koa 沒有防范作為響應(yīng)體的所有內(nèi)容 - 函數(shù)沒有有意義地序列化,返回布爾值可能會根據(jù)您的應(yīng)用程序而有意義。并且當錯誤生效時,它可能無法正常工作 錯誤的屬性無法枚舉。 我們建議在您的應(yīng)用中添加中間件,以確定每個應(yīng)用的正文類型。 示例中間件可能是:
app.use(async (ctx, next) => {
await next()
ctx.assert.equal('object', typeof ctx, 500, '某些開發(fā)錯誤')
})
Content-Type 默認為 text/html 或 text/plain, 同時默認字符集是 utf-8。Content-Length 字段也是如此。
Content-Type 默認為 application/octet-stream, 并且 Content-Length 字段也是如此。
Content-Type 默認為 application/octet-stream。
每當流被設(shè)置為響應(yīng)主體時,.onerror 作為偵聽器自動添加到 error 事件中以捕獲任何錯誤。此外,每當請求關(guān)閉(甚至過早)時,流都將被銷毀。如果你不想要這兩個功能,請勿直接將流設(shè)為主體。例如,當將主體設(shè)置為代理中的 HTTP 流時,你可能不想要這樣做,因為它會破壞底層連接。
參閱: https://github.com/koajs/koa/pull/612 獲取更多信息。
以下是流錯誤處理的示例,而不會自動破壞流:
const PassThrough = require('stream').PassThrough;
app.use(async ctx => {
ctx.body = someHTTPStream.on('error', ctx.onerror).pipe(PassThrough());
});
Content-Type 默認為 application/json. 這包括普通的對象 { foo: 'bar' } 和數(shù)組 ['foo', 'bar']。
不區(qū)分大小寫獲取響應(yīng)標頭字段值 field。
const etag = ctx.response.get('ETag');
如果當前在傳出標頭中設(shè)置了由名稱標識的標頭,則返回 true. 標頭名稱匹配不區(qū)分大小寫.
const rateLimited = ctx.response.has('X-RateLimit-Limit');
設(shè)置響應(yīng)標頭 field 到 value:
ctx.set('Cache-Control', 'no-cache');
用值 val 附加額外的標頭 field。
ctx.append('Link', '<http://127.0.0.1/>');
用一個對象設(shè)置多個響應(yīng)標頭fields:
ctx.set({
'Etag': '1234',
'Last-Modified': date
});
這將委托給 setHeader ,它通過指定的鍵設(shè)置或更新標頭,并且不重置整個標頭。
刪除標頭 field。
獲取響應(yīng) Content-Type 不含參數(shù) "charset"。
const ct = ctx.type;
// => "image/png"
設(shè)置響應(yīng) Content-Type 通過 mime 字符串或文件擴展名。
ctx.type = 'text/plain; charset=utf-8';
ctx.type = 'image/png';
ctx.type = '.png';
ctx.type = 'png';
注意: 在適當?shù)那闆r下為你選擇 charset, 比如 response.type = 'html' 將默認是 "utf-8". 如果你想覆蓋 charset, 使用 ctx.set('Content-Type', 'text/html') 將響應(yīng)頭字段設(shè)置為直接值。
非常類似 ctx.request.is(). 檢查響應(yīng)類型是否是所提供的類型之一。這對于創(chuàng)建操縱響應(yīng)的中間件特別有用。
例如, 這是一個中間件,可以削減除流之外的所有HTML響應(yīng)。
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);
});
執(zhí)行 [302] 重定向到 url.
字符串 “back” 是特別提供Referrer支持的,當Referrer不存在時,使用 alt 或“/”。
ctx.redirect('back');
ctx.redirect('back', '/index.html');
ctx.redirect('/login');
ctx.redirect('http://google.com');
要更改 “302” 的默認狀態(tài),只需在該調(diào)用之前或之后分配狀態(tài)。要變更主體請在此調(diào)用之后:
ctx.status = 301;
ctx.redirect('/cart');
ctx.body = 'Redirecting to shopping cart';
將 Content-Disposition 設(shè)置為 “附件” 以指示客戶端提示下載。(可選)指定下載的 filename 和部分 參數(shù)。
檢查是否已經(jīng)發(fā)送了一個響應(yīng)頭。 用于查看客戶端是否可能會收到錯誤通知。
將 Last-Modified 標頭返回為 Date, 如果存在。
將 Last-Modified 標頭設(shè)置為適當?shù)?UTC 字符串。您可以將其設(shè)置為 Date 或日期字符串。
ctx.response.lastModified = new Date();
設(shè)置包含 " 包裹的 ETag 響應(yīng), 請注意,沒有相應(yīng)的 response.etag getter。
ctx.response.etag = crypto.createHash('md5').update(ctx.body).digest('hex');
在 field 上變化。
刷新任何設(shè)置的標頭,并開始主體。
更多建議: