@expr
The @expr
directive is defined as follows:
directive @expr(body: JSON) on FIELD_DEFINITION | OBJECT
The @expr
directive in GraphQL is a powerful tool for embedding data directly into your schema, offering two primary functionalities:
Static
This feature allows for the inclusion of a constant response within the schema definition itself. It is useful for scenarios where the response is unchanging. e.g:
schema {
query: Query
}
type Query {
user: User @expr(body: {name: "John", age: 12})
}
type User {
name: String
age: Int
}
The @expr
directive also checks the provided value at compile time to ensure it matches the field's schema. If not, the console displays a descriptive error message.
Dynamic
Beyond static data embedding, the @expr
directive extends its utility to support dynamic data injection through Mustache template syntax. This feature enables the use of placeholders within the constant data, which are then dynamically replaced with actual values at runtime. It supports both scalar values and complex objects, including lists and nested objects, offering flexibility in tailoring responses to specific needs. e.g:
schema {
query: Query
}
type Query {
user: User
@expr(
body: {
name: "John"
workEmail: "[email protected]"
personalEmail: "[email protected]"
}
)
}
type User {
name: String
age: Int
personalEmail: String
workEmail: String
emails: Emails
@expr(
body: {
emails: {
workEmail: "{{.value.workEmail}}"
personalEmail: "{{.value.personalEmail}}"
}
}
)
}
type Emails {
workEmail: String
personalEmail: String
}
In this example, the @expr
directive dynamically generates an Emails
object based on the provided template data. The placeholders within the template ({{.value.workEmail}}
and {{.value.personalEmail}}
) get replaced with the actual values specified in the User
type, allowing for dynamic content generation while still adhering to the schema's structure.
Combining Multiple Directives
The @expr
directive can be used in combination with other resolvable directives, with results merged deeply. This allows for powerful and flexible resolver configurations.
For more details, see Directives Documentation.