在 Koa.js 中,上下文(Context)是一个代表当前请求和响应的对象,它在每个中间件函数中作为第一个参数传递。上下文对象(ctx)包含了请求信息、响应信息和一些其他有用的属性和方法。

上下文对象(ctx)具有以下常用属性和方法:

  • ctx.request:表示客户端请求的对象,包含了请求的方法、URL、头部和主体等信息。
  • ctx.response:表示服务器发送的响应对象,包含了响应的状态、头部和主体等信息。
  • ctx.state:用于在中间件之间共享数据的对象。可以将一些共享的状态存储在 ctx.state 中,供后续的中间件使用。
  • ctx.params:表示请求的路由参数的对象,例如 /:id 路径中的 id 参数可以通过 ctx.params.id 访问到。
  • ctx.query:表示请求的查询参数的对象,例如在 /?name=John URL 中的 name 参数可以通过 ctx.query.name 访问到。
  • ctx.cookies:用于读取和设置请求的 Cookie。
  • ctx.throw():用于抛出一个 HTTP 错误,例如 ctx.throw(404, 'Not Found')
  • ctx.redirect():用于重定向到指定的 URL。

中间件之间共享数据的方式是通过上下文对象的 ctx.state 属性。可以将需要共享的数据存储在 ctx.state 中,然后在后续的中间件中通过 ctx.state 访问和使用这些数据。例如:

app.use(async (ctx, next) => {
  ctx.state.user = { name: 'John' };
  await next();
});
 
app.use(async (ctx) => {
  console.log(ctx.state.user.name); // 输出 'John'
  ctx.body = 'Hello, ' + ctx.state.user.name;
});

在上面的例子中,第一个中间件函数将用户对象存储在 ctx.state.user 中,然后在第二个中间件函数中通过 ctx.state.user.name 访问并使用这个数据。

通过上下文对象和 ctx.state 属性,可以实现中间件之间的数据共享,使得开发者能够在请求处理的不同阶段访问和操作相同的数据。