Cómo configurar una API potente con GraphQL, Koa y MongoDB - CRUD

Esta es una serie en la que aprendemos cómo configurar una API potente con GraphQL, Koa y Mongo. El enfoque principal estará en GraphQL. Mira la parte I de esta serie de artículos, si aún no lo has hecho.

Mutaciones

Hasta ahora podemos leer nuestros datos, pero existe una buena posibilidad de que necesitemos editar nuestros registros / documentos de datos. Cualquier plataforma de datos completa también necesita una forma de modificar los datos del lado del servidor.

Imagine que una empresa ha lanzado un nuevo dispositivo. ¿Cómo haríamos para agregar el registro a nuestra base de datos con GraphQL?

¿Qué son las mutaciones?

Piense en mutaciones como acciones POST o PUT REST. Configurar una mutación es bastante sencillo.

¡Saltemos!

Agregar registros a nuestra base de datos

Cree un archivo graphql / mutations.js.

Dentro del archivo, colocaremos mutaciones.

  • Importaremos los objetos GraphQLObjectType y GraphQLObjectType de la biblioteca GraphQL.
  • Importe el tipo GraphQL para gadget.
  • Importa el modelo de gadget Mongoose.

Después de importar las cosas que necesitamos, podemos crear la mutación.

Una mutación es simplemente un GraphQLObjectType simple, como la consulta que teníamos antes. Tiene dos propiedades principales que nos interesan.

  1. El nombre de la mutación es lo que aparece en los documentos graphiql.

2. Los campos son donde podemos colocar nuestra lógica de mutación.

Observe que agregué un nuevo objeto dentro del objeto de campos. Se llama addGadget, y hará exactamente lo que dice que hará.

Dentro del addGadget tenemos acceso a tres propiedades, type, args y resolve ().

El tipo addGadget será gadgetGraphQLType. El gadget solo puede tener propiedades permitidas en el tipo de gadgetGraphQLType que declaramos anteriormente.

addGadget es una consulta que acepta argumentos. Los argumentos son necesarios para especificar qué gadget queremos agregar a nuestra base de datos.

Declaramos por adelantado qué argumentos acepta la consulta y los tipos de argumentos.

Por último, ¿qué sucede con la consulta? Esto es precisamente por qué tenemos la función resolve ().

Recuerde que la función resolve () tiene dos argumentos: padre y args. Estamos interesados ​​en los argumentos, ya que estos son los valores que pasamos a nuestra consulta.

Dentro de la resolución, colocamos la lógica para crear un nuevo registro de Mongo.

Creamos una nueva instancia de nuestro modelo Gadget Mongoose, pasamos los accesorios que recibimos de GraphQL como nuevos campos y finalmente guardamos el registro.

Así es como se ve la mutación completa:

graphl / mutations.js

Voilà! Todo lo que necesitamos hacer es importar la mutación a nuestro archivo schema.js.

graphl / schema.js

Si todo salió bien, esto es lo que deberíamos ver en nuestro GraphiQL:

Y si hacemos clic en él:

Observe cómo GraphQL crea automáticamente la autodocumentación.

Disparando la consulta de mutación

Una mutación es solo una consulta simple de GraphQL, que toma nuestros argumentos, la guarda en la base de datos Mongo y devuelve las propiedades que deseamos.

Aquí está el truco: cada mutación debe marcarse como mutación:

Hemos creado e insertado con éxito un nuevo gadget en nuestra base de datos Mongo.

Si se dirige a mLab, o al proveedor que esté utilizando, debería ver el nuevo registro.

Aquí está la consulta completa de nuestra mutación.

Edición de nuestros registros en la base de datos

¿Qué pasa si queremos editar registros preexistentes? No podemos confiar en nunca cometer un error, o ¿qué pasa si el precio cambia?

Editar un registro también es una mutación. Recuerde, cada vez que queremos cambiar / agregar un nuevo registro, ¡es una mutación GraphQL!

Abra el archivo graphql / mutations y cree otra mutación. Una mutación es solo un objeto simple.

Observe que la nueva mutación se llama updateGadget. Es más o menos una réplica de la mutación anterior. Observe el argumento adicional, la identificación, eso se debe a que necesitamos encontrar el gadget existente y cambiarlo. Podemos encontrar el gadget por id.

La función resolve () es donde se vuelve más interesante. Idealmente, queremos encontrar el gadget por id, cambiar los accesorios y guardarlo. ¿Cómo haríamos para hacer esto?

Mongoose nos da un método para hacer esto, llamado findById.

Esto devuelve una promesa. Si consolamos.logueamos la promesa, podemos ver una gran cantidad de propiedades adjuntas. Lo que podemos hacer con la promesa es encadenarlo con un método then ().

Entonces, encontramos el gadget, cambiamos los accesorios y lo guardamos. Pero esto devuelve otra promesa que debemos resolver.

.catch () para el manejo de errores, en caso de que encontremos errores. Recuerde, puede monitorear sus registros pm2 a través del comando pm2 logs. Si se encuentra con errores, estos se registrarán en el registrador pm2.

¡Eso es todo! Tiempo de consulta. Mire su tabla Mongo y elija una identificación aleatoria desde allí, luego edite el gadget correspondiente.

Y si inspeccionamos la base de datos, deberíamos ver el registro editado.

¡Éxito!

Aquí está la consulta para la mutación updateGadget.

De acuerdo, hasta ahora tenemos Crear, Leer y Actualizar, pero nos falta la d final (elegir).

Eliminar un registro de una base de datos Mongo es bastante sencillo. Todo lo que necesitamos es otra mutación, ya que, de hecho, estamos mutando la base de datos.

Para eliminar registros, Mongoose nos ofrece un método útil llamado findOneAndDelete: puede leer más sobre findOneAndDelete aquí.

Eliminar el registro solo requiere un argumento: la identificación. Encontramos el gadget por id, lo eliminamos y lo devolvemos. Si hay un error, lo registraremos.

Y la consulta:

Nota: Asegúrese de que la identificación sea correcta y exista en la base de datos; de lo contrario, no funcionará.

Si nos dirigimos a nuestra base de datos y la inspeccionamos, de hecho, el registro se eliminó de nuestra base de datos.

Bien hecho, hemos logrado la funcionalidad CRUD básica. Observe cómo GraphQL es una capa delgada entre nuestra base de datos y la vista. No se supone que reemplace una base de datos, sino que facilite el trabajo con datos, obtención y manipulación.

Si se siente bien con GraphQL, le recomiendo leer el libro "El camino hacia GraphQL" para una inmersión más profunda.

Aquí está el código fuente:

No te pierdas la tercera parte donde haremos más cosas geniales:

¡Gracias por leer!