1 官方文档描述
Koa Context 将 node 的 request
和 response
对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。 这些操作在 HTTP 服务器开发中频繁使用,它们被添加到此级别而不是更高级别的框架,这将强制中间件重新实现此通用功能。
每个 请求都将创建一个 Context
,并在中间件中作为接收器引用,或者 ctx
标识符,如以下代码片段所示:
app.use(async ctx => {
ctx; // 这是 Context
ctx.request; // 这是 koa Request
ctx.response; // 这是 koa Response
});
为方便起见许多上下文的访问器和方法直接委托给它们的 ctx.request
或 ctx.response
,不然的话它们是相同的。 例如 ctx.type
和 ctx.length
委托给 response
对象,ctx.path
和 ctx.method
委托给 request
。
2 每个 请求都将创建一个 Context
// application.js
callback() {
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 context
createContext(req, res) {
// 继承自application的context
const 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;
}