Tu primer server GraphQL

Federico Marcos

marcosfede

marcosfede@gmail.com

≈ Físico

Data scientist @                 

Motivaciones 

  • Cómo enviar solo la información que el cliente necesita

    • Tamaño del Payload (ejemplo)

    • mala señal o baja calidad de red

  • Cómo manejar información de recursos relacionados

    • Duplicación de data / lógica

    • Custom / integration endpoints

    • No single roundtrip si necesitas más de un recurso

  • ​​Coupling entre Front y Backend
    • ​Diferentes teams
  • Lenguaje de consulta
  • Una especificacion con implementaciones en varios lenguajes
  • Open sourced por Facebook en 2015
  • Puede usarse con cualquier tipo de DB / sin DB
  • Habilidad de consultar exactamente lo que necesitas y nada mas
  • Obtener multiples recursos en un solo request
  • Desacoplar las necesidades del Front al backend

Que es GraphQL

SWAPI Example

 Clientes de Frontend

  • State management (Casi) automatico
  • Declarative data fetching 
  • Data normalization
  • Caching
  • Optimistic UI
  • Soporte para REST! apollo-link-rest

Server

  • Mucho Tooling
  • GraphQL Subscriptions!
  • TypeScript typings
  • GraphQL Playground
  • Buena doc
  • Muchos ejemplos
  • File upload
  • apollo-server-express
  • apollo-server-koa
  • apollo-server-hapi
  • apollo-server-lambda
  • apollo-server-azure-functions
  • apollo-server-cloud-functions
  • apollo-server-cloudflare

type Person{
    id: ID!
    birth_year: String!
    eye_color: String!
    films: [Film!]
    gender: String!
    hair_color: String!
    height: Float!
    homeworld: Planet
    mass: String!
    name: String!
    skin_color: String!
    created: DateTime!
    edited: DateTime!
    specie: Specie
    starships: [Starship!]
    vehicles: [Vehicle!]
}
type Query {
    person(personId: ID!): Person
    people(limit: Int, offset: Int): [Person!]!
}

type Mutation {
    renamePerson(personId: ID!, name: String!): Person
    deletePerson(personId: ID!): Person
}

type Subscription {
    personChange(personId: ID!): Person!
    newPeople: Person!
}
export const queries = {
  person: async (_, { id }) => getRepository(Person).findOneById(id),
  people: async (_, { limit }) => {
    const opts: any = {}
    if (limit) { opts.take = limit }
    return getRepository(Person).find(opts)
  },
}



export const fields = {
  homeworld: (person, params, { loaders }) => {
    if (!person.homeworldId) {
      return null
    }
    return loaders.planetLoader.load(person.homeworldId)
  },
}
query {
  people {
    homeworld {
      name
    }
  }
}
{
  "data": {
    "people": [
      {
        "homeworld": {
          "name": "Tatooine"
        }
      },
      {
        "homeworld": {
          "name": "Bespin"
        }
      },
     ...
    ]}
}
type Query {
    people: [Person!]!
}

type Person{
    ...
    homeworld: Planet
    ...
}

Batching

Caching

Propósito general

Algo repetitivo

No se encarga del ORM

Dynamically translates GraphQL to SQL for efficient, batched data retrieval before resolution 

                          SELECT                               {
  user(id: 1) {               "user"."id",                         user: {
    idEncoded                 "user"."first_name",                   idEncoded: 'MQ==',
    fullName        ==>       "user"."last_name",        ==>         fullName: 'andrew carlson',
    email                     "user"."email_address"                 email: 'andrew@stem.is'
  }                         FROM "accounts" AS "user"              }
}                           WHERE "user"."id" = 1                }

No maneja el esquema

Buena performance

Object Mapping

Demo

Buena doc y ejemplos

Query Performance

No es el santo grial de GQL

Super fast development

Subscriptions!

PostGraphile

Performance

Insta API si ya tenes una DB

Lógica custom en SQL...

Apollo Engine

  • Schema explorer

  • Schema history

  • Performance analytics

  • Query tracing

  • Error tracking

  • Performance alerts

 

Gracias!

Your first GraphQL server

By Federico Marcos

Your first GraphQL server

  • 348