¿Cómo crear un servidor GraphQL con Go (Golang) y MongoDB?

Alejandro Aldana
6 min readAug 8, 2021

Se entiende como la otra gran forma de construir un servidor de peticiones, estoy hablando de GraphQL, a diferencia de su principal alternativa (REST), GraphQL nos deja tener un mayor control de como enviamos y recibimos información al momento de consultar el endpoint.

Pero, como se logra esto con Go. Iremos por partes y especificando cada comando y fragmento de código para lograr esto. Cabe destacar que este código es multiplataforma, por lo que funcionara igual de bien en Windows como Linux, con sus respectivas anotaciones a la hora de configurar los path.

  • Preconfiguración:

Lo primero será crear el repositorio del proyecto, en la terminal o línea de comandos, debemos colocarnos en la carpeta donde hayamos declarado nuestro “GOPATH”, que en mi caso es directamente en el disco “D:\Documents\Go\src\”, si aún no lo tienes configurado y declarado, te invito a que lo hagas primero, ya que de esta forma será más fácil este ejercicio y no habrá errores de path, este proceso a grandes rasgos es declarar 4 variables de entorno, 2 para el sistema y 2 para el usuario, hecho esto, podemos continuar. El comando que ejecutaremos para inicializar nuestro repositorio y directorio de trabajo será:

go mod init <repositorio>
Nota: el intérprete del terminal usado es “Hyper” y no CMD de Windows

Procederemos a descargar una librería especifica para el uso de GraphQL con el siguiente comando:

go get <libreria>

Posteriormente ejecutamos esta librería para que nos genere un paquete dentro de nuestro directorio:

go run <libreria> init

Listo, hasta este punto llega la preconfiguración de nuestro proyecto y entorno de trabajo, podemos programar el servidor.

  • Programación del servidor:

Empezaremos por declarar el schema que usara graphql para trabajar todos los componentes, este schema determinará en gran parte el funcionamiento total de nuestro servidor, así que habrá que declararlo con gran exactitud, ya que de lo contrario no podremos hacerlo al general el interprete, en nuestro caso será de la siguiente forma:

schema.graphqls

A continuación generaremos el intérprete, pero primero debemos eliminar el archivo “schemas.resolvers .go” ubicado en “MyProject/graph/”. Una vez eliminado, ejecutamos el comando para generarlo de nuevo con el nuevo schema, hay 2 formas para llamar este comando, cualquiera de los 2 es válido:

- go generate- go run github.com/99designs/gqlgen generate

Si todo salió bien, volveremos a tener el archivo “schema.resolvers.go” al cual le haremos algunas modificaciones en unos momentos más, en este momento crearemos nuestro paquete de base de datos, donde haremos la importación de mongo. Crearemos una carpeta dentro de nuestro proyecto llamada “database” y dentro crearemos un archivo llamado “database.go” para que dentro de este archivo, creemos nuestros conectores y se vea de la siguiente forma:

Ejemplo de database.go
database.go

Ahora haremos el mismo procedimiento pero con el controlador, creamos una carpeta llamada “controller” y dentro un archivo llamado “controller.go” donde vivira el código de nuestros endpoints, esto con el fin de delegar toda la lógica a este archivo y que no viva en “schema.resolvers.go” ya que este archivo se genera conforme el shcema de graphql. Este archivo se vería así:

Ejemplo de controller.go
controller.go

Ahora lo que procederemos a hacer es editar el archivo “schema.resolvers.go” agregando los componentes necesarios a este, no hace falta remplazar todo el código, solo modificar las funciones que tenemos ya, en el caso de la practica se debería de ver de la siguiente forma:

Ejemplo de schema.resolvers.go
schema.resolvers.go

Por último, solo queda editar el archivo que levanta el servidor, “server.go”, este paso no es obligatorio, solamente haremos un ping a la base de datos para asegurarnos que estamos conectados, eso seria agregando 2 líneas al programa de esta forma (Marcadas con blanco):

server.go
server.go
  • Ejecución del servidor:

Ahora, para poder ejecutar nuestro servicio, debemos dirigirnos en nuestro CMD, Termina o interprete de elección hacia la carpeta que contenga nuestro proyecto, dentro de esta, debemos teclear el comando:

go run server.go

Como este proyecto usa GraphQL y además hacemos uso de Playground, no necesitamos acceder a Postman o Insomnia para hacer pruebas, basta con dirigirnos a nuestro “localhost:8080” para hacer uso de esta herramienta y poder mandar peticiones.

  • Ejemplos en Playground

Insert o Create:

A continuación, probaremos cada ruta para saber qué datos toma de entrada y cuales arroja de salida. En el primer ejemplo, usaremos el equivalente a un “insert” en nuestro caso, la mutación de GraphQL llamada “createBook”, la cual del lado izquierdo esta la información que necesita y del derecho la que nos trae como resultado:

Ejemplo de creación.

Estructura de la información de entrada:

mutation createBook {
createBook (
input: { title:"Libro 4", name:"Nombre 4", userId:"4"}
) {
author {
id
name
}
id
title
}
}

Find o Select:

Ahora lo que haremos sera consultar esta información hacia mongo y hacer el equivalente a un select o find, en este caso, del lado izquierdo será la estructura que queremos de vuelta y del derecho el resultado, cabe destacar que aquí es donde mas brilla GraphQL, ya que se dicha estructura del lado izquierdo no necesitamos el id (por ejemplo) simplemente lo retiramos de la petición y con eso basta para tener una respuesta distinta, como se ve en los ejemplos:

Ejemplo de find.

Estructura de entrada completa:

query findBooks {
books {
id
title
author {
id
name
}
}
}
  • Conclusión:

Con forme la tecnología avanza y se crean nuevas arquitecturas y formas de lograr la misma cosa con enfoques distintos, es bueno tener este panorama para saber qué decisión a nivel de arquitectura vamos a tomar a la hora de implementar un nuevo proyecto o hacer alguna mejora/actualización, es por esta razón, por el hecho de poder controlar la respuesta y tener un paradigma distinto a REST que GraphQL se posiciona como una alternativa muy solida la cual puede ser de fácil implementación como lo vimos ahora y que además nos ofrece una forma diferente de poder acceder a la información de un servidor, todo esto con Go Lang.

  • Mas información y agradecimientos:

El repositorio completo de esta practica lo puedes encontrar aquí.

Por su atención… muchas gracias.

--

--