1 官方文档描述
Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。 这些操作在 HTTP 服务器开发中频繁使用,它们被添加到此级别而不是更高级别的框架,这将强制中间件重新实现此通用功能。
每个 请求都将创建一个 Context,并在中间件中作为接收器引用,或者 ctx 标识符,如以下代码片段所示:
app.use(async ctx => {ctx; // 这是 Contextctx.request; // 这是 koa Requestctx.response; // 这是 koa Response});
为方便起见许多上下文的访问器和方法直接委托给它们的 ctx.request或 ctx.response ,不然的话它们是相同的。 例如 ctx.type 和 ctx.length 委托给 response 对象,ctx.path 和 ctx.method 委托给 request。
2 每个 请求都将创建一个 Context
// application.jscallback() {const fn = compose(this.middleware);if (!this.listenerCount('error')) this.on('error', this.onerror);const handleRequest = (req, res) => {// 每个请求进来,都会创建一个ctx,并把这个上下文传递进middleware函数const ctx = this.createContext(req, res);return this.handleRequest(ctx, fn);};return handleRequest;}
3 Koa Context 将 node 的 request 和 response 对象封装到单个对象中
// application.js// Initialize a new contextcreateContext(req, res) {// 继承自application的contextconst context = Object.create(this.context);// 挂载koa的request和response对象const request = context.request = Object.create(this.request);const response = context.response = Object.create(this.response);// 给koa的context、requset、response对象挂载application实例context.app = request.app = response.app = this;// **Koa Context 将 node 的 request 和 response 对象封装到单个对象中**// 把node的reqest和response挂载到koa的context、response、request对象上context.req = request.req = response.req = req;context.res = request.res = response.res = res;// koa的对象之间互相挂载request.ctx = response.ctx = context;request.response = response;response.request = request;context.originalUrl = request.originalUrl = req.url;context.state = {};return context;}
