Categorías
Temporada 0

Log 0.4

GraphQL

Esta sección corresponde con la parte 8 del curso.

GraphQL plantea una forma de interactuar con los datos distinta a la que conocemos como REST.

Para poner en marcha un servicio de GraphQL hacemos uso del servidor Apolo

npm i apollo-server

Y montamos un archivo que lanzaremos con node que incluya tanto la definición de las estructuras de los datos como la de las llamadas:

Definimos las estructuras y las consultas:

const typeDefs = gql`
  type Book {
    title: String!
    published: Int!
    author: String!
    id: ID!
    genres: [String!]!
  }
  type Query {
    bookCount: Int!
     allBooks(author: String, genre: String): [Book!]!
  }
`

Además, debemos definir lo que se conoce como resolvers, que hacen uso de las estructuras de consulta que hemos definido para responder:

const resolvers = {
  Query: {
    bookCount: () => books.length,
    allBooks: (root, args) => {
      if(!args.author && !args.genre){
        return books
      } if (!args.genre) {
      return(books.filter(book => book.author === args.author))
      }
      if (!args.author){
        return(books.filter(book => book.genres.includes(args.genre) ))
      }
      return(books.filter(book => book.author === args.author && book.genres.includes(args.genre) ))
      },
    }

En estos resolvers podemos incluir toda la lógica que queramos para responder en función de nuestras necesidades.

Con ello, GraphQL opera como traductor entre la consulta y los datos adaptando las respuestas a las necesidades, previamente definidas, del cliente.

Además, durante el desarrollo, si trabajamos con el servidor Apollo, tendremos un entorno de pruebas donde realizar las consultas y ver qué responde el servidor de forma rápida y cómoda.

Conclusiones

Pese a que en un principio era algo reticente y consideraba que mis proyectos irían todos enfocados a servicios REST, esta solución me está pareciendo cada vez más interesante y más útil y es posible que me plantee incluirla en Heres I.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *