GraphQL y express - Queries

Joel H. Gomez Paredes
codecrafters
Published in
4 min readJan 31, 2017

GraphQL es un lenguaje que nos permite describir los datos de nuestra API y poder consultarlos especificando que información necesitamos. En contraste con REST esta especificación brinda un mecanismo más flexible en cuanto a consulta de datos debido a que nos permite acceder a través de nodos a los datos que solicitamos, a diferencia de REST en el cual manejamos múltiples urls para acceder a los distintos recursos de la aplicación.

Para entender GraphQL recomiendo que no pienses en urls, piensa en puntos de entrada, cada punto de entrada es un nodo que puede conectar con otros nodos de información (Query) o puntos de entrada que modifiquen la base de datos (Mutation).

GraphQL es un estándar independiente de la tecnología al igual que REST, en el caso de express, GraphQL actúa como middleware en la ruta /graphql para interactuar con los datos dependiendo de la estructura descrita en el servidor ya sea para ejecutar un Query o una Mutation.

Flujo de Query o Mutation de GraphQL

El ejemplo que vamos a desarrollar es un simple API de pokemon con GraphQL. Este es el repositorio de la API, usaremos express como framework web, mongoose para conectarnos con la base de datos en MongoDB y babel-cli para usar la sintaxis de ES6. El proyecto está dividido en ramas enumeradas y también está organizado con la siguiente estructura de folders y archivos:

  • models
  • mutations
  • queries
  • schemas
  • types
  • server.js
  • seed.js

models. Contendrá los modelos de base de datos que vamos a utilizar para la API (Category, Attack y Pokemon).

types. Tendrá la descripción de los nodos que vamos a consultar, estos estarán ligados a cada uno de los modelos de la carpeta models.

queries. Nodos que vamos a tener en la raíz del endpoint asi como los orígenes de datos.

schema. Definición de los queries y mutaciones a los que responderá GraphQL y con que tipo de nodo estarán asociados.

1. Definición de modelos

El primero es el modelo de Category que indica a que categoría pertenece un pokemon o un ataque. Por su parte el modelo Attack nos indica a que categoría pertenece un ataque.

Modelo Category y Attack

El modelo pokemon tiene datos básicos y su respectiva colección de objetos Attack y Category.

Modelo Pokemon

2. Definición de tipos

Una vez que tenemos nuestros modelos, podemos definirlos en GraphQL usando los tipos de datos que este provee. Cuando son atributos que hacen referencia a un objeto o colección de objetos en una base de datos podemos ejecutar un query usando nuestros modelos dentro del método resolve.

Tipos de nodos en GraphQL

3. Definición de queries

Una vez que tenemos los tipos de nodos que componen nuestra API, podemos definir nuestros nodos de entrada, en este caso usamos el método resolve para devolver la lista de datos. Cada nodo raíz debe tener un origen de datos así como en la definición de tipos las referencias a otros nodos o tipos debe tener un origen de datos .

4. Definición de schemas

Una vez que tenemos los nodos de entrada creamos el nodo raíz Query y lo agregamos al Schema.

Schema del API pokemon con 3 endpoints : attacks, pokemons y categories

5. Integración de express con GraphQL

Una vez que importamos el esquema lo asignamos al middleware y asignamos graphiql en true, con esto podemos tener una ventana interactiva en la cual podemos ejecutar queries.

Código del servidor

Para poder visualizar datos no te olvides de ejecutar el comando npm run seed.Al finalizar ejecuta npm start y tendrás una API funcionando con GraphQL, en próximos post agregaremos a este ejemplo argumentos para filtrar y Mutations para modificar datos.

Query con GraphQL

--

--

Joel H. Gomez Paredes
codecrafters

Frontend Developer at Platzi, Google Developer Expert in Web Technologies And Google Maps Platform, A Reverse Developer & Fullsnack JS Developer