Interfaz Node de Relay
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
En esta sección, continuamos con el ejemplo de GraphQL explicando cómo implementar la Interfaz Node de Relay. Si no estás familiarizado con la interfaz Node, lee los siguientes párrafos extraídos de relay.dev:
Para ofrecer opciones a los clientes GraphQL que manejen elegantemente el caché y la recarga de datos, los servidores GraphQL necesitan exponer identificadores de objetos de forma estandarizada. En las consultas, el esquema debe proporcionar un mecanismo estándar para solicitar un objeto por ID. En la respuesta, el esquema ofrece una forma estandarizada de proporcionar estos IDs.
Nos referimos a objetos con identificadores como "nodos". Un ejemplo de ambos sería la siguiente consulta:
{
node(id: "4") {
id
... on User {
name
}
}
}
Clonar el código (opcional)
El código de este tutorial está disponible en github.com/a8m/ent-graphql-example, con etiquetas (usando Git) en cada paso. Si deseas saltar la configuración básica y comenzar con la versión inicial del servidor GraphQL, puedes clonar el repositorio así:
git clone git@github.com:a8m/ent-graphql-example.git
cd ent-graphql-example
go run ./cmd/todo/
Implementación
Ent soporta la interfaz Node mediante su integración con GraphQL. Siguiendo unos sencillos pasos puedes añadir soporte
en tu aplicación. Comenzamos indicando a gqlgen que Ent proporciona la interfaz Node editando el archivo
gqlgen.yaml de la siguiente forma:
# This section declares type mapping between the GraphQL and Go type systems.
models:
# Defines the ID field as Go 'int'.
ID:
model:
- github.com/99designs/gqlgen/graphql.IntID
Node:
model:
- todo/ent.Noder
Para aplicar estos cambios, volvemos a ejecutar la generación de código:
go generate .
Como antes, necesitamos implementar los resolvers de GraphQL en ent.resolvers.go. Con un cambio de una línea,
podemos implementarlos reemplazando el código generado por gqlgen con lo siguiente:
func (r *queryResolver) Node(ctx context.Context, id int) (ent.Noder, error) {
- panic(fmt.Errorf("not implemented: Node - node"))
+ return r.client.Noder(ctx, id)
}
func (r *queryResolver) Nodes(ctx context.Context, ids []int) ([]ent.Noder, error) {
- panic(fmt.Errorf("not implemented: Nodes - nodes"))
+ return r.client.Noders(ctx, ids)
}
Consultar Nodos
Ahora podemos probar nuestros nuevos resolvers de GraphQL. Comencemos creando varios elementos "todo" ejecutando esta consulta múltiples veces (modificar las variables es opcional):
mutation CreateTodo($input: CreateTodoInput!) {
createTodo(input: $input) {
id
text
createdAt
priority
parent {
id
}
}
}
# Query Variables: { "input": { "text":"Create GraphQL Example", "status": "IN_PROGRESS", "priority": 1 } }
# Output: { "data": { "createTodo": { "id": "2", "text": "Create GraphQL Example", "createdAt": "2021-03-10T15:02:18+02:00", "priority": 1, "parent": null } } }
Ejecutar la API Node en uno de los items todo devolverá:
query {
node(id: 1) {
id
... on Todo {
text
}
}
}
# Output: { "data": { "node": { "id": "1", "text": "Create GraphQL Example" } } }
Ejecutar la API Nodes en uno de los items todo devolverá:
query {
nodes(ids: [1, 2]) {
id
... on Todo {
text
}
}
}
# Output: { "data": { "nodes": [ { "id": "1", "text": "Create GraphQL Example" }, { "id": "2", "text": "Create Tracing Example" } ] } }
¡Bien hecho! Como ves, cambiando unas pocas líneas de código nuestra aplicación ahora implementa la Interfaz Node de Relay. En la siguiente sección, mostraremos cómo implementar la especificación Relay Cursor Connections usando Ent, algo muy útil si queremos que nuestra aplicación soporte paginación y segmentación de resultados.