Context
The Context Object
Section titled “The Context Object”The Context object is the “heart” of every request in Jazzy. It is passed to every route handler and middleware, providing a unified interface to interact with both the incoming request and the outgoing response.
Structure of Context
Section titled “Structure of Context”A Context object contains several key components:
request: Access incoming data (headers, body, query params, etc.).response: Control the outgoing response (status, body, headers).auth: Manage user authentication and sessions.cache: Direct access to the application-level cache.requestId: A unique ID generated for every request (useful for logging).
Accessing Information
Section titled “Accessing Information”Basic Helpers
Section titled “Basic Helpers”ctx.ip(): Automatically detects and returns the client’s IP address (respectsTRUST_PROXY).ctx.param(key): Retrieves dynamic route parameters (e.g.,/users/:id).ctx.input(key): Retrieves data from query strings or JSON bodies automatically.ctx.header(key): (Response) Sets a response header.ctx.status(code): (Response) Sets the HTTP status code.
Request Properties
Section titled “Request Properties”You can access raw request data via ctx.request:
ctx.request.headers: A table of incoming HTTP headers.ctx.request.httpMethod: The HTTP method (HttpGet, HttpPost, etc.).ctx.request.path: The requested URL path.ctx.request.body: The raw request body as a string.
Generating Responses
Section titled “Generating Responses”Context provides fluent methods for sending different types of content:
proc handler(ctx: Context) {.async.} = ctx.status(200) .header("X-Powered-By", "Jazzy") .json(%*{"message": "Hello World"})See the Responses documentation for more details.
Dependency Injection via Context
Section titled “Dependency Injection via Context”Because Context is passed everywhere, it serves as the primary way to access global services like Cache or Auth in a thread-safe manner:
proc dashboard(ctx: Context) {.async.} = if ctx.check(): # Check if user is logged in let user = ctx.user() let stats = ctx.cache.get("global_stats") ctx.json(%*{"user": user, "stats": stats})