1 官方文档描述

Koa Context 将 node 的 requestresponse 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。 这些操作在 HTTP 服务器开发中频繁使用,它们被添加到此级别而不是更高级别的框架,这将强制中间件重新实现此通用功能。
每个 请求都将创建一个 Context,并在中间件中作为接收器引用,或者 ctx 标识符,如以下代码片段所示:

  1. app.use(async ctx => {
  2. ctx; // 这是 Context
  3. ctx.request; // 这是 koa Request
  4. ctx.response; // 这是 koa Response
  5. });

为方便起见许多上下文的访问器和方法直接委托给它们的 ctx.requestctx.response ,不然的话它们是相同的。 例如 ctx.typectx.length 委托给 response 对象,ctx.pathctx.method 委托给 request

2 每个 请求都将创建一个 Context

  1. // application.js
  2. callback() {
  3. const fn = compose(this.middleware);
  4. if (!this.listenerCount('error')) this.on('error', this.onerror);
  5. const handleRequest = (req, res) => {
  6. // 每个请求进来,都会创建一个ctx,并把这个上下文传递进middleware函数
  7. const ctx = this.createContext(req, res);
  8. return this.handleRequest(ctx, fn);
  9. };
  10. return handleRequest;
  11. }

3 Koa Context 将 node 的 requestresponse 对象封装到单个对象中

  1. // application.js
  2. // Initialize a new context
  3. createContext(req, res) {
  4. // 继承自application的context
  5. const context = Object.create(this.context);
  6. // 挂载koa的request和response对象
  7. const request = context.request = Object.create(this.request);
  8. const response = context.response = Object.create(this.response);
  9. // 给koa的context、requset、response对象挂载application实例
  10. context.app = request.app = response.app = this;
  11. // **Koa Context 将 node 的 request 和 response 对象封装到单个对象中**
  12. // 把node的reqest和response挂载到koa的context、response、request对象上
  13. context.req = request.req = response.req = req;
  14. context.res = request.res = response.res = res;
  15. // koa的对象之间互相挂载
  16. request.ctx = response.ctx = context;
  17. request.response = response;
  18. response.request = request;
  19. context.originalUrl = request.originalUrl = req.url;
  20. context.state = {};
  21. return context;
  22. }