Si sucede un error al momento de realizar una petición GraphQL nos va a retornar un objeto llamado errors que contendrá la información del error y su mensaje. Podemos configurar el mensaje que le retorne al usuario simplemente con una función que lance un error con el mensaje que queramos.
Es bueno boom, pero si es bueno tambien saber como lo podemos hacer nosotros!
lo mejor es no depender de tantas librerias externas, ya que si dejan de dar soporte tendrás que hacer un refactor
hasta aquí he podido entender la mayoría de las cosas....
Este profesor explica muy bien
Qué se te ha dificultado?
exelente profesor, deberian usarlo mas, solo una critica constructiva creo que deberia hablar un poco mas rapido a 1.25x se siente muy bien el paso del curso.
del resto muy buena la explicacion
Concuerdo, excelente explicacion del profesor en las clases, pero demasiado lento al hablar. Yo tengo que ponerlo a 1.5x
Se puede configurar los mensajes de error con más parametros, ej: CODE, TYPE: Warning, Info etc
Si exactamente, le puedes pasar todo tipo de parámetros a tus errores para personalizarlos aún más
Muy Buen Profesor de verdad
¿Hay manera de traducir los errores por defecto de GraphQL?
Si, en el middleware de GraphQL hay una config para setear una fn que maneja los errores: customFormatErrorFn. Recibe un error y podes devolver el objeto que quieras.
Las inconsistencias en los esquemas son errores que debemos de tener cuidado de evitar. Nos impideran manejar la información de manera correcta.
NO es buena practica devolverle errores técnicos a los usuarios. Tienen que ser errores amigables 🦄.
Creamos 'lib/errorHandler.js':
functionerrorHandler(error){console.log(error)thrownewError('Fallo en la operación del servidor');}module.exports= errorHandler;
Y los usamos en todos los archivos donde usábamos console.error(error)
const errorHandler = require('./errorHandler')
'use strict'functionerrorHandler(error){console.error(error)thrownewError('Fallo en la operacion del servidor')}module.exports= errorHandler
'use strict'functionerrorHandler(err){console.err(err);thrownewError('Fallo en la operacion');}module.exports= errorHandler;
Maneja los errores con este funcion...
es console.error()
Aún con este errorHandler sigo obteniendo el mismo error sin ninguna modificación.
La BD tiene 2 registros, uno de ellos no tiene el campo "name", mientras que el otro sí. Se retornan 2 registros, y quien no tiene el campo dicho, devuelve un null, lo cual es esperado.
Sin embargo, el array de errores me sigue trayendo el mismo error, como si nunca hubiese agregado el manejador de errores.
La consulta es esta
{ getCourses{ _id
name
}}
Y el resultado es este otro:
{"errors":[{"message":"Cannot return null for non-nullable field Course.name.","locations":[{"line":5,"column":3}],"path":["getCourses",2,"name"]}],"data":{"getCourses":[{"_id":"5f1881e726906178577109f0","name":"Course 1"},null,]}}
¿Alguna idea?
Excelente, muy sencilla la explicación
'use strict'functionerrorHandler(error){console.error(error)thrownewError('Fabllo en la operacion del servidor')}module.exports= errorHandler
Podriamos haber saltado esta clase pero se agradece
Si hubiera sido bueno que explicara cómo contolar los errores propios de los campos obligatorios. Por ejemplo, si el title es obligatorio para crear un curso y no se envía.
mutation {createCourse(input:{description:"Descripcion 4",topic:"diseño"}){ _id
title
description
}}
{"error":{"errors":[{"message":"Field \"CourseInput.title\" of required type \"String!\" was not provided.","locations":[{"line":2,"column":23}]}]}}
Lo podemos validar nosotros y en caso de que asi fuere tener valores por default que suplan la carencia de la informacion requerida
Mi consulta es como controlas los errores para el Frontend ERROR de permiso error de validación de un campo que solo requiere 4 caracteres, etc
esto normalmenet se hace con un validador de formularios, pero es buena practica hacer validaciones tambien en el backend, yo normalmente hago eso con https://www.npmjs.com/package/joi
Excelente cierre de bloque!!
Hola a todos... me quedé con una duda. El error que presenta GraphQL al insertar el Course no es de la inserción propiamente tal, de hecho el curso se inserta. El error es al desplegar el resultado, porque necesita desplegar un campo que supuestamente debe existir pero que quedó nulo.
Ahora, si ejecutamos el mutation de esta forma:
mutation {createCourse(input:{description:"created to be deleted"topic:"oJ^"}){ _id
}}
No hay ningún problema aparente. El mensaje devuelto por GraphQL fue limpio:
Ni tampoco se gatilló un error en el código del mutation.
Sigamos... si ejecuto el query de los cursos sólo rescatando el _id, la respuesta se devuelve incluyendo el ID de la inserción que hicimos un poco más arriba. Sin errores:
Pero realizamos el query pidiendo el title de los cursos... armagedón!!! tenemos el error de despliegue, como lo vimos en la clase en el moemento de la inserción.
{ getCourses{ _id
title
}}// Respuesta{"errors":[{"message":"Cannot return null for non-nullable field Course.title.","locations":[{"line":4,"column":5}],"path":["getCourses",5,"title"]}],"data":{"getCourses":[{"_id":"5f7b8cc9673aba0478c9a319","title":"My title 1"},{"_id":"5f7b8cc9673aba0478c9a31a","title":"My title 2"},{"_id":"5f7b8cc9673aba0478c9a31c","title":"My title 4"},{"_id":"5f7b8cc9673aba0478c9a31b","title":"My title 3"},{"_id":"5f7ba24862e33f0c436dd5ae","title":"My title 5 - v2"},null]}}
Esta vez no incluyó obviamente el ID del curso con problemas.... pero ese curso sí existe en la colección, y es un curso "ocrrupto" ... jejejeje
Por lo tanto, el control lo debemos mantener en nuestro código. ¿O hay algo que me perdí?
Si no tengo cuidado revisando los datos previamente en mi código podría enterarme mucho después de tener datos corruptos en mis colecciones.
Finalmente, al presentarse un error de este tipo (desplegando datos que se supone deben existir en el documento) no se dispara un error en el código del query, por lo que por cada ejecución que se realice, deberíamos revisar el contenido de la respuesta buscando un arreglo llamado "errors" para ver su hubo algún problema.
(escribí todo esto al finalizar la clase... veamos qué viene a continuación, espero que después de tanto escribir no me den la respuesta en los primeros 15 segundos de la siguiente clase)