Introduction

Que es graphQL?

Es una tecnologia creada por Facebook, se trata de un lenguaje de consulta para integrar a nuestra aplicaciones. Esta tecnologia nos permite definir que dato pedirles a la aplicacion el cual la integramos. GraphQL es una especificacion de implementacion, el cual puede aplicarsele a varios lenguaje de programacion, no es una libreria o marco de trabajo (framework).

Configuracion basica

En esta guia todo estara basado en Nodejs y Express. Para comenzar nuestra aplicacion junto a GraphQL, debemos crear el directorio de proyecto con el nombre que desee, luego atraves de nuestro terminal ir a la raiz de nuestro proyecto. Una vez en la raiz iniciamos nuestro directorio de aplicacion con:

$ npm init

Luego de llenar nuestra informacion al proyecto y iniciarlo, vamos a añadir los paquetes necesario para nuestra aplicacion.

$ npm -i -save express express-graphql graphql

Al finalizar de añadir las librerias necesaria, creamos el archivo server.js en el cual vamos a utilizar para escribir el codigo fuente de nuestra aplicacion. Dentro de nuestro archivo server.js escribimos lo siguiente:

// server.js

import express from 'express'

// Declare an app from express
const app = express()

// Catch all request or 404
app.all('*', (req, res) => {
  res.json({ok: true})
})

app.listen(3000, () => {
  console.log(`Server listening on port ${PORT}`)
})

Luego ejecutamos nuestra aplicacion atraves del terminal:

$ node server.js

Luego de iniciar la aplicacion si problema podemos verificar que todo este bien atravez del navegador o terminar con cURL.

$ curl http://0.0.0.0:3000
{"ok":true}

Crear esquema y utilizar metodo buildSchema

Esquema (Schema)

Un esquema(schema) consiste en una lista de definiciones de tipos. GraphQL contiene un sistema de tipo el cual nos permite definir tipos. Un sistema de tipo es un conjunto de reglas el cual son aplicado a algún entidad. GraphQL utiliza el sintaxi de lenguaje SDL(Schema Definition Language) para definir sus tipos. Para demostrar un ejemplo, vamos a definir el tipo Post con el lenguaje SDL.

type Post {
  id: ID!
  description: String!
  imageUrl: String!
}

Tipos (Type)

Son utilizadas para describir un conjunto de reglas.

type User {
  name: String!
  username: String!
}

El caracter ! indica que este campo dentro del tipo es requerido.

Relacion

En GraphQL podemos espresar relacion entre tipos.

type User {
  name: String!
  username: String!
}

type Document {
  title: String!
  content: String!
  author: User!
}

Consulta (Query)

Es un tipo especial el cual su proposito es ser utilizada para consultar datos. Este puede recibir parametro y devolver cualquier tipo o lista (Array).

Schema Root Type

Cada esquema contiene una tipo raíz, este engloba todo los tipos en un simple tipo raiz. Dentro contiene:

  • Query - Especificado para todo los tipos para hacer consulta a entidades.
  • Mutation - Especificado para las mutaciones, realizar cambios a entidades.
  • Mutation - Especificado para todos los tipos de mutaciones(cambios) el cual pueden ser ejecutada por nuestro servidor GraphQL.
  • Subscription - Especificado para todos los tipos de suscripciones.

Resolve

Cuando definimos un esquema, a este esquema debemos proveer unos métodos resolve, estos metodos mapea un consulta (Query) o mutacion (Mutation) para ejecutar algun codigo cuando se haga una llamada a ella.

buildSchema

Este métodos el cual nos provee GraphQL, nos permite desarrollar un esquema el cual podemos integrar a nuestro servidor GraphQL.

import express from 'express'
import  { buildSchema } from 'graphql'
import graphqlHTTP from 'express-graphql'

const app = express()

/* 
 * buildSchema - To create a  GraphQLschema from template string.
 */
let schema = buildSchema(`
  type Query {
    postTitle: String
  }
`)

/* 
 * root - Provides a resolver function for each API endpoint.
 */
let root = {
  postTitle: () => ('Mattis ullamcorper velit sed ullamcorper')
}

/*
 * Graphql router
 */
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true // Set to false if you dont want graphiql enabled
}))

app.listen(3000, () => {
  console.log(`Server listening on port ${PORT}`)
})

Query:

{
  postTitle
}

Tipos Primitivos

En GraphQL existe los siguientes tipos primitivos ID, String, Int, Float y Boolean.

import express from 'express'
import  { buildSchema } from 'graphql'
import graphqlHTTP from 'express-graphql'

const app = express()

let schema = buildSchema(`
  type Query {
    id: ID,
    title: String,
    duration: Int,
    watched: Boolean
  }
`)

let root = {
  id: () => '1',
  title: () => 'Mattis ullamcorper velit sed ullamcorper',
  duration: () => 180,
  watched: () => false
}

app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true 
}))

app.listen(3000, () => {
  console.log(`Server listening on port ${PORT}`)
})

Query:

query {
  id
  title
  duration
  watched
}

Tipo Objeto

import express from 'express'
import  { buildSchema } from 'graphql'
import graphqlHTTP from 'express-graphql'

const app = express()

let schema = buildSchema(`
  type Video {
    id: ID,
    title: String,
    duration: Int,
    watched: Boolean
  }

  type Query {
    video: Video
  }
`)

let video = {
  id: '1',
  title: 'Mattis ullamcorper velit sed ullamcorper',
  duration: 180,
  watched: false
}

let root = {
  video: () => video
}

app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true 
}))

app.listen(3000, () => {
  console.log(`Server listening on port ${PORT}`)
})

Query:

{
  video {
    id
    title
    duration
    watched
  }
}

Tipo Lista

import express from 'express'
import  { buildSchema } from 'graphql'
import graphqlHTTP from 'express-graphql'

const app = express()

let schema = buildSchema(`
  type Video {
    id: ID,
    title: String,
    duration: Int,
    watched: Boolean
  }

  type Query {
    video: Video
    videos: [Video]
  }
`)

let video = {
  id: '1',
  title: 'Mattis ullamcorper velit sed ullamcorper',
  duration: 180,
  watched: false
}

let videos = [{
  id: '1',
  title: 'Mattis ullamcorper velit sed ullamcorper',
  duration: 180,
  watched: false 
},{
  id: '2',
  title: 'Habitasse platea dictumst vestibulum',
  duration: 240,
  watched: true 
},{
  id: '3',
  title: 'Urna et pharetra pharetra massa massa',
  duration: 160,
  watched: false 
},{
  id: '4',
  title: 'Eu facilisis sed odio morbi',
  duration: 260,
  watched: true 
},{
  id: '5',
  title: 'Egestas egestas fringilla phasellus',
  duration: 190,
  watched: false 
},{
  id: '6',
  title: 'Pharetra massa massa ultricies',
  duration: 160,
  watched: false 
}]

let root = {
  video: () => video,
  videos: () => videos
}

app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true
}))

app.listen(3000, () => {
  console.log(`Server listening on port ${PORT}`)
})

Query:

{
  videos {
    id
    title
    duration
    watched
  }
}

results matching ""

    No results matching ""