Skip to main content

GraphQL Resolver Context

Within Tailcall, Context is a pivotal component that allows for dynamic retrieval of values during the resolution of fields for a given type within the schema.

Schema Definition

type Context = {
args: Map<string, JSON>
value: JSON
env: Map<string, string>
vars: Map<string, string>
headers: Map<string, string>
}

Context operates by storing values as key-value pairs, which can be accessed through mustache template syntax.

args

This property facilitates access to query arguments. Consider the example:

type Query {
user(id: ID!): User
@http(
url: "http://jsonplaceholder.typicode.com/users/{{.args.id}}"
)
}

Here, args.id is utilized to retrieve the id argument provided to the user query.

value

This enables access to the fields of the specified type.

type Post {
id: ID!
title: String!
body: String!
comments: [Comment]
@http(
url: "http://jsonplaceholder.typicode.com/posts/{{.value.id}}/comments"
)
}

In this case, value.id accesses the id field of the Post type.

env

Environment variables, set at server startup, allow directives to dynamically adapt behavior based on external configurations without altering the server configuration itself.

Example:

type Query {
users: [User]! @http(url: "{{.env.API_ENDPOINT}}/users")
}

env.API_ENDPOINT references an environment variable named API_ENDPOINT, which specifies the base URL for HTTP requests.

vars

vars offers a mechanism for defining reusable variables within the configuration. Unlike env, these are embedded and can be universally applied across configurations.

schema
@server(
vars: {key: "apiKey", value: "{{.env.AUTH_TOKEN}}"}
) {
query: Query
}

type Query {
user(id: ID!): [User]
@http(
url: "/users"
headers: [
{
key: "Authorization"
value: "Bearer {{.vars.apiKey}}"
}
]
)
}

Here, the variable apiKey is set using an environment variable and subsequently utilized in the Authorization header for HTTP requests.

headers

Headers originate from the request made to the GraphQL server.

type Query {
commentsForUser: [Comment]
@http(
url: "http://jsonplaceholder.typicode.com/users/{{.headers.x-user-id}}/comments"
)
}

In this example, headers.x-user-id extracts the value of the x-user-id header present in the request, dynamically constructing the request path.