Koa 上下文(Context)

2020-02-07 15:24 更新

上下文(Context)

Koa Context 將 node 的 request 和 response 對(duì)象封裝到單個(gè)對(duì)象中,為編寫 Web 應(yīng)用程序和 API 提供了許多有用的方法。 這些操作在 HTTP 服務(wù)器開發(fā)中頻繁使用,它們被添加到此級(jí)別而不是更高級(jí)別的框架,這將強(qiáng)制中間件重新實(shí)現(xiàn)此通用功能。

_每個(gè)_ 請求都將創(chuàng)建一個(gè) Context,并在中間件中作為接收器引用,或者 ctx 標(biāo)識(shí)符,如以下代碼片段所示:

app.use(async ctx => {
  ctx; // 這是 Context
  ctx.request; // 這是 koa Request
  ctx.response; // 這是 koa Response
});

為方便起見許多上下文的訪問器和方法直接委托給它們的 ctx.request或 ctx.response ,不然的話它們是相同的。 例如 ctx.type 和 ctx.length 委托給 response 對(duì)象,ctx.path 和 ctx.method 委托給 request。

API

Context 具體方法和訪問器.

ctx.req

Node 的 request 對(duì)象.

ctx.res

Node 的 response 對(duì)象.

繞過 Koa 的 response 處理是 不被支持的. 應(yīng)避免使用以下 node 屬性:

  • res.statusCode
  • res.writeHead()
  • res.write()
  • res.end()

ctx.request

koa 的 Request 對(duì)象.

ctx.response

koa 的 Response 對(duì)象.

ctx.state

推薦的命名空間,用于通過中間件傳遞信息和你的前端視圖。

ctx.state.user = await User.find(id);

ctx.app

應(yīng)用程序?qū)嵗?/p>

ctx.app.emit

Koa 應(yīng)用擴(kuò)展了內(nèi)部 EventEmitter。ctx.app.emit 發(fā)出一個(gè)類型由第一個(gè)參數(shù)定義的事件。對(duì)于每個(gè)事件,您可以連接 "listeners",這是在發(fā)出事件時(shí)調(diào)用的函數(shù)。有關(guān)更多信息,請參閱錯(cuò)誤處理文檔

ctx.cookies.get(name, [options])

通過 options 獲取 cookie name:

  • signed 所請求的cookie應(yīng)該被簽名

koa 使用 cookies 模塊,其中只需傳遞參數(shù)。

ctx.cookies.set(name, value, [options])

通過 options 設(shè)置 cookie name 的 value :

  • maxAge 一個(gè)數(shù)字表示從 Date.now() 得到的毫秒數(shù)
  • signed cookie 簽名值
  • expires cookie 過期的 Date
  • path cookie 路徑, 默認(rèn)是'/'
  • domain cookie 域名
  • secure 安全 cookie
  • httpOnly 服務(wù)器可訪問 cookie, 默認(rèn)是 true
  • overwrite 一個(gè)布爾值,表示是否覆蓋以前設(shè)置的同名的 cookie (默認(rèn)是 false). 如果是 true, 在同一個(gè)請求中設(shè)置相同名稱的所有 Cookie(不管路徑或域)是否在設(shè)置此Cookie 時(shí)從 Set-Cookie 標(biāo)頭中過濾掉。

koa 使用傳遞簡單參數(shù)的 cookies 模塊。

ctx.throw([status], [msg], [properties])

Helper 方法拋出一個(gè) .status 屬性默認(rèn)為 500 的錯(cuò)誤,這將允許 Koa 做出適當(dāng)?shù)仨憫?yīng)。

允許以下組合:

ctx.throw(400);
ctx.throw(400, 'name required');
ctx.throw(400, 'name required', { user: user });

例如 ctx.throw(400, 'name required') 等效于:

const err = new Error('name required');
err.status = 400;
err.expose = true;
throw err;

請注意,這些是用戶級(jí)錯(cuò)誤,并用 err.expose 標(biāo)記,這意味著消息適用于客戶端響應(yīng),這通常不是錯(cuò)誤消息的內(nèi)容,因?yàn)槟幌胄孤┕收显敿?xì)信息。

你可以根據(jù)需要將 properties 對(duì)象傳遞到錯(cuò)誤中,對(duì)于裝載上傳給請求者的機(jī)器友好的錯(cuò)誤是有用的。這用于修飾其人機(jī)友好型錯(cuò)誤并向上游的請求者報(bào)告非常有用。

ctx.throw(401, 'access_denied', { user: user });

koa 使用 http-errors 來創(chuàng)建錯(cuò)誤。status 只應(yīng)作為第一個(gè)參數(shù)傳遞。

ctx.assert(value, [status], [msg], [properties])

當(dāng) !value 時(shí),Helper 方法拋出類似于 .throw() 的錯(cuò)誤。這與 node 的 assert() 方法類似.

ctx.assert(ctx.state.user, 401, 'User not found. Please login!');

koa 使用 http-assert 作為斷言。

ctx.respond

為了繞過 Koa 的內(nèi)置 response 處理,你可以顯式設(shè)置 ctx.respond = false;。 如果您想要寫入原始的 res 對(duì)象而不是讓 Koa 處理你的 response,請使用此參數(shù)。

請注意,Koa _不_ 支持使用此功能。這可能會(huì)破壞 Koa 中間件和 Koa 本身的預(yù)期功能。使用這個(gè)屬性被認(rèn)為是一個(gè) hack,只是便于那些希望在 Koa 中使用傳統(tǒng)的 fn(req, res) 功能和中間件的人。

Request 別名

以下訪問器和 Request 別名等效:

  • ctx.header
  • ctx.headers
  • ctx.method
  • ctx.method=
  • ctx.url
  • ctx.url=
  • ctx.originalUrl
  • ctx.origin
  • ctx.href
  • ctx.path
  • ctx.path=
  • ctx.query
  • ctx.query=
  • ctx.querystring
  • ctx.querystring=
  • ctx.host
  • ctx.hostname
  • ctx.fresh
  • ctx.stale
  • ctx.socket
  • ctx.protocol
  • ctx.secure
  • ctx.ip
  • ctx.ips
  • ctx.subdomains
  • ctx.is()
  • ctx.accepts()
  • ctx.acceptsEncodings()
  • ctx.acceptsCharsets()
  • ctx.acceptsLanguages()
  • ctx.get()

Response 別名

以下訪問器和 Response 別名等效:

  • ctx.body
  • ctx.body=
  • ctx.status
  • ctx.status=
  • ctx.message
  • ctx.message=
  • ctx.length=
  • ctx.length
  • ctx.type=
  • ctx.type
  • ctx.headerSent
  • ctx.redirect()
  • ctx.attachment()
  • ctx.set()
  • ctx.append()
  • ctx.remove()
  • ctx.lastModified=
  • ctx.etag=


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)