Koa's Context object (ctx) is a core concept that encapsulates Node.js's request and response objects into a single object, providing a more concise API through proxy pattern.
Core properties and methods of ctx object:
Request-related properties:
ctx.request: Koa's Request objectctx.req: Node.js native request objectctx.request.url: Request URLctx.request.method: Request methodctx.request.header: Request header objectctx.request.query: Parsed query stringctx.request.querystring: Raw query stringctx.request.path: Request pathctx.request.body: Request body (requires body-parser middleware)
Response-related properties:
ctx.response: Koa's Response objectctx.res: Node.js native response objectctx.response.body: Response bodyctx.response.status: Response status codectx.response.header: Response header objectctx.response.type: Response Content-Typectx.response.length: Response Content-Length
Convenient access (directly through ctx):
ctx.url: Equivalent to ctx.request.urlctx.method: Equivalent to ctx.request.methodctx.header: Equivalent to ctx.request.headerctx.query: Equivalent to ctx.request.queryctx.body: Equivalent to ctx.response.bodyctx.status: Equivalent to ctx.response.statusctx.type: Equivalent to ctx.response.type
Other important properties:
ctx.state: Recommended namespace for passing information between middlewarectx.app: Application instance referencectx.cookies: Cookie manipulation utilityctx.throw(): Throw HTTP errorsctx.assert(): Assertion check
Code example:
javascriptapp.use(async (ctx) => { // Get request info const url = ctx.url; const method = ctx.method; const query = ctx.query; // Set response ctx.status = 200; ctx.type = 'application/json'; ctx.body = { message: 'Hello Koa' }; // Use state to pass data ctx.state.user = { id: 1, name: 'John' }; // Throw error if (!ctx.query.token) { ctx.throw(401, 'Token required'); } });
Design advantages of ctx object:
- Conciseness: Reduces code redundancy, improves development efficiency
- Consistency: Unified API interface, reduces learning cost
- Flexibility: Supports both convenient access and direct native object manipulation
- Extensibility: Can extend ctx object functionality through middleware