Koa 的 Context 把 node 的 request, response 对象封装进一个单独对象, 并提供许多开发 web 应用和 APIs 有用的方法. 那些在 HTTP server 开发中使用非常频繁操作, 直接在 Koa 里实现, 而不是放在更高层次的框架, 这样中间件就不需要重复实现这些通用的功能.
每个 请求会创建自己的 Context 实例, 在中间件中作为 receiver 引用, 或通过 this 标示符引用. 如.:
app.use(function *(){
this; // is the Context
this.request; // is a koa Request
this.response; // is a koa Response
});
Context 的许多访问器和方法直接委托为他们的 ctx.request 或 ctx.response 的 等价方法, 用于访问方便, 是完全相同的. 比如ctx.type 和 ctx.length 委托与 response 对象, ctx.path 和 ctx.method 委托与 request.
Context 详细方法和访问器.
Node 的 request 对象.
Node 的 response 对象.
绕开 Koa 的 response 处理 是 不支持的. 避免使用如下 node 属性:
koa Request 对象.
koa Response 对象.
应用实例引用.
获取名为 name 带有 options 的 cookie:
koa 使用 cookies 模块, options 被直接传递过去.
设置 cookie name 为 value 带有 options:
koa 使用 cookies 模块, options 被直接传递过去.
Helper 方法, 抛出包含 .status 属性的错误, 默认为 500. 该方法让 Koa 能够合适的响应. 并且支持如下组合:
例如 this.throw('name required', 400) 等价于:
var err = new Error('name required');
err.status = 400;
throw err;
注意这些是 user-level 的错误, 被标记为 err.expose, 即这些消息可以用于 client 响应, 而不是 error message 的情况, 因为你不想泄露失败细节.
你可以传递一个 properties 对象, 该对象会被合并到 error 中, 这在修改传递给上游中间件的机器友好错误时非常有用
this.throw(401, 'access_denied', { user: user });
this.throw('access_denied', { user: user });
koa 使用 http-errors 创建错误对象.
抛出错误的 Helper 方法, 跟 .throw() 相似 当 !value. 跟 node 的 assert() 方法相似.
this.assert(this.user, 401, 'User not found. Please login!');
koa 使用 http-assert 实现断言.
如不想使用 koa 内置的 response 处理方法, 可以设置 this.respond = false;. 这时你可以自己设置 res 对象.
注意这样使用是不被 Koa 支持的. 这样有可能会破坏 Koa 的中间件和 Koa 本身内部功能. 这种用法只是作为一种 hack 方式, 给那些想在 Koa 中间件和方法内使用传统的fn(req, res) 一种方式
如下访问器和别名同 Request 等价:
如下访问器和别名同 Response 等价: