此係列文章的應用示例已發佈於 GitHub: koa-docs-Zh-CN. 能夠 Fork 幫助改進或 Star 關注更新. 歡迎 Star.html
Koa Request
對象是在 node 的 vanilla 請求對象之上的抽象,提供了諸多對 HTTP 服務器開發有用的功能。node
請求標頭對象。git
設置請求標頭對象。github
請求標頭對象。別名爲 request.header
.express
設置請求標頭對象。別名爲 request.header=
.json
請求方法。api
設置請求方法,對於實現諸如 methodOverride()
的中間件是有用的。數組
返回以數字返回請求的 Content-Length,或 undefined
。緩存
獲取請求 URL.服務器
設置請求 URL, 對 url 重寫有用。
獲取請求原始URL。
獲取URL的來源,包括 protocol
和 host
。
ctx.request.origin // => http://example.com
獲取完整的請求URL,包括 protocol
,host
和 url
。
ctx.request.href; // => http://example.com/foo/bar?q=1
獲取請求路徑名。
設置請求路徑名,並在存在時保留查詢字符串。
根據 ?
獲取原始查詢字符串.
設置原始查詢字符串。
使用 ?
獲取原始查詢字符串。
設置原始查詢字符串。
獲取當前主機(hostname:port)。當 app.proxy
是 true 時支持 X-Forwarded-Host
,不然使用 Host
。
存在時獲取主機名。當 app.proxy
是 true 時支持 X-Forwarded-Host
,不然使用 Host
。
若是主機是 IPv6, Koa 解析到
WHATWG URL API,
注意 這可能會影響性能。
獲取 WHATWG 解析的 URL 對象。
獲取請求 Content-Type
不含參數 "charset"。
const ct = ctx.request.type; // => "image/png"
在存在時獲取請求字符集,或者 undefined
:
ctx.request.charset; // => "utf-8"
獲取解析的查詢字符串, 當沒有查詢字符串時,返回一個空對象。請注意,此 getter 不 支持嵌套解析。
例如 "color=blue&size=small":
{ color: 'blue', size: 'small' }
將查詢字符串設置爲給定對象。 請注意,此 setter 不 支持嵌套對象。
ctx.query = { next: '/login' };
檢查請求緩存是否「新鮮」,也就是內容沒有改變。此方法用於 If-None-Match
/ ETag
, 和 If-Modified-Since
和 Last-Modified
之間的緩存協商。 在設置一個或多個這些響應頭後應該引用它。
// 新鮮度檢查須要狀態20x或304 ctx.status = 200; ctx.set('ETag', '123'); // 緩存是好的 if (ctx.fresh) { ctx.status = 304; return; } // 緩存是陳舊的 // 獲取新數據 ctx.body = await db.find('something');
相反與 request.fresh
.
返回請求協議,「https」 或 「http」。當 app.proxy
是 true 時支持 X-Forwarded-Proto
。
經過 ctx.protocol == "https"
來檢查請求是否經過 TLS 發出。
請求遠程地址。 當 app.proxy
是 true 時支持 X-Forwarded-Proto
。
當 X-Forwarded-For
存在而且 app.proxy
被啓用時,這些 ips 的數組被返回,從上游 - >下游排序。 禁用時返回一個空數組。
將子域返回爲數組。
子域是應用程序主域以前主機的點分隔部分。默認狀況下,應用程序的域名假定爲主機的最後兩個部分。這能夠經過設置 app.subdomainOffset
來更改。
例如,若是域名爲「tobi.ferrets.example.com」:
若是 app.subdomainOffset
未設置, ctx.subdomains
是 ["ferrets", "tobi"]
.
若是 app.subdomainOffset
是 3, ctx.subdomains
是 ["tobi"]
.
檢查傳入請求是否包含 Content-Type
頭字段, 而且包含任意的 mime type
。
若是沒有請求主體,返回 null
。
若是沒有內容類型,或者匹配失敗,則返回 false
。
反之則返回匹配的 content-type。
// 使用 Content-Type: text/html; charset=utf-8 ctx.is('html'); // => 'html' ctx.is('text/html'); // => 'text/html' ctx.is('text/*', 'text/html'); // => 'text/html' // 當 Content-Type 是 application/json 時 ctx.is('json', 'urlencoded'); // => 'json' ctx.is('application/json'); // => 'application/json' ctx.is('html', 'application/*'); // => 'application/json' ctx.is('html'); // => false
例如,若是要確保僅將圖像發送到給定路由:
if (ctx.is('image/*')) { // 處理 } else { ctx.throw(415, 'images only!'); }
Koa的 request
對象包括由 accepts 和 negotiator 提供的有用的內容協商實體。
這些實用程序是:
request.accepts(types)
request.acceptsEncodings(types)
request.acceptsCharsets(charsets)
request.acceptsLanguages(langs)
若是沒有提供類型,則返回 全部 可接受的類型。
若是提供多種類型,將返回最佳匹配。 若是沒有找到匹配項,則返回一個false
,你應該向客戶端發送一個406 "Not Acceptable"
響應。
若是接收到任何類型的接收頭,則會返回第一個類型。 所以,你提供的類型的順序很重要。
檢查給定的 type(s)
是否能夠接受,若是 true
,返回最佳匹配,不然爲 false
。 type
值多是一個或多個 mime 類型的字符串,如 application/json
,擴展名稱如 json
,或數組 ["json", "html", "text/plain"]
。
// Accept: text/html ctx.accepts('html'); // => "html" // Accept: text/*, application/json ctx.accepts('html'); // => "html" ctx.accepts('text/html'); // => "text/html" ctx.accepts('json', 'text'); // => "json" ctx.accepts('application/json'); // => "application/json" // Accept: text/*, application/json ctx.accepts('image/png'); ctx.accepts('png'); // => false // Accept: text/*;q=.5, application/json ctx.accepts(['html', 'json']); ctx.accepts('html', 'json'); // => "json" // No Accept header ctx.accepts('html', 'json'); // => "html" ctx.accepts('json', 'html'); // => "json"
你能夠根據須要屢次調用 ctx.accepts()
,或使用 switch:
switch (ctx.accepts('json', 'html', 'text')) { case 'json': break; case 'html': break; case 'text': break; default: ctx.throw(406, 'json, html, or text only'); }
檢查 encodings
是否能夠接受,返回最佳匹配爲 true
,不然爲 false
。 請注意,您應該將identity
做爲編碼之一!
// Accept-Encoding: gzip ctx.acceptsEncodings('gzip', 'deflate', 'identity'); // => "gzip" ctx.acceptsEncodings(['gzip', 'deflate', 'identity']); // => "gzip"
當沒有給出參數時,全部接受的編碼將做爲數組返回:
// Accept-Encoding: gzip, deflate ctx.acceptsEncodings(); // => ["gzip", "deflate", "identity"]
請注意,若是客戶端顯式地發送 identity;q=0
,那麼 identity
編碼(這意味着沒有編碼)多是不可接受的。 雖然這是一個邊緣的狀況,你仍然應該處理這種方法返回 false
的狀況。
檢查 charsets
是否能夠接受,在 true
時返回最佳匹配,不然爲 false
。
// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5 ctx.acceptsCharsets('utf-8', 'utf-7'); // => "utf-8" ctx.acceptsCharsets(['utf-7', 'utf-8']); // => "utf-8"
當沒有參數被賦予全部被接受的字符集將做爲數組返回:
// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5 ctx.acceptsCharsets(); // => ["utf-8", "utf-7", "iso-8859-1"]
檢查 langs
是否能夠接受,若是爲 true
,返回最佳匹配,不然爲 false
。
// Accept-Language: en;q=0.8, es, pt ctx.acceptsLanguages('es', 'en'); // => "es" ctx.acceptsLanguages(['en', 'es']); // => "es"
當沒有參數被賦予全部接受的語言將做爲數組返回:
// Accept-Language: en;q=0.8, es, pt ctx.acceptsLanguages(); // => ["es", "pt", "en"]
檢查請求是不是冪等的。
返回請求套接字。
返回請求標頭。
若是這篇文章對您有幫助, 感謝 下方點贊 或 Star GitHub: koa-docs-Zh-CN 支持, 謝謝.