Integraciones GraphQL y NodeJS mediante Cloud Code Functions
GraphQL aporta azúcar, especias y todo lo bueno a los desarrolladores de API, pero es básicamente un lenguaje de consulta para que pueda especificar lo que está buscando.
¿Y si necesitas más inteligencia de negocio que eso en tu aplicación?
¿Y si necesitas algo de lógica?
¿Qué pasa si usted quiere que el módulo NPM ordenada junto con él?
Bueno, abróchense los cinturones porque hoy les mostraré algo muy poderoso. Y con grandes poderes, vienen grandes… bueno… grandes ahorros de tiempo, grandes posibilidades, grandes montones de cosas buenas…
Si quieres saber más sobre GraphQL echa un vistazo a este post: Qué es GraphQL
Contents
- 1 Debes ser así de alto para montar…
- 2 Nuestra nueva y brillante característica: GraphQL + Funciones Cloud Code
- 3 Pero de nuevo… ¿qué pasa con GraphQL?
- 4 Las Clases y Objetos que usaremos
- 5 Y algunas Funciones de Cloud Code
- 6 Un pequeño paso extra
- 7 Ahora, tiempo para la magia…
- 8 Tus increíbles definiciones fueron actualizadas
- 9 Conclusión
- 10 ¿Qué es Cloud Code?
- 11 ¿Cómo ayuda Cloud Code a ahorrar batería en el teléfono celular?
- 12 ¿Cómo ayuda Cloud Code a ahorrar datos?
Debes ser así de alto para montar…
Y utiliza Parse 3.5.0 o superior para jugar con GraphQL.
Ve a Configuración del Servidor y Administrar Servidor Parse y asegúrate de que estás usando una versión compatible.
Nuestra nueva y brillante característica: GraphQL + Funciones Cloud Code
Si ya eres usuario de Parse/Back4app, probablemente hayas usado o al menos oído hablar de Cloud Code.
Cloud Code es esencialmente código NodeJS que se ejecuta desde los servidores de Aplicaciones de Back4app en lugar de los dispositivos finales.
Esto trae algunas ventajas clave dependiendo de sus necesidades, pero esencialmente le permite:
-
Ahorrar batería del celular
Al sacar la carga pesada de procesamiento del dispositivo a la Nube, el procesamiento intenso no se hará en el dispositivo, ahorrando batería. El procesamiento se realiza en nuestros servidores y el cliente sólo recibe el resultado final. Se acabó el móvil caliente en el bolsillo. No más “OMG esta aplicación me chupa la batería”.
-
Ahorra en planes de datos
Así que tiene una tonelada de objetos que debe recuperar para obtener un informe. ¿Miles? ¿Millones?
Eso es un montón de datos que debe recuperar y si usted no está en WiFi, es mejor conseguir que la actualización del plan de datos del teléfono celular.
Todos sabemos que el plan de datos es bastante caro (ya nadie paga por los mensajes SMS, ¿verdad?) Así que, ¿y si tuviéramos un enfoque más inteligente?
¿Y si pudiéramos obtener el informe totalmente calculado en la nube y recuperar sólo el último resultado en el dispositivo? ¿Una carga útil más pequeña que consumiría mucho menos de tu plan de datos y también funcionaría más rápido?
¿Le parece increíble? Eso es lo que hace Cloud Code…
-
Consiga un despliegue de código más rápido
Érase una vez en que los desarrolladores tenían que volver a publicar su software en las App Stores. Eso solía ser una lotería: consigue un revisor rápido y tu aplicación estará disponible para los usuarios el mismo día. Si el revisor era más lento o quisquilloso, la aplicación podía tardar semanas en publicarse. Si se publicaba.
¿Por qué arriesgarse?
Entrega sólo la parte frontend de tu Aplicación a las App Stores y deja tanta lógica como sea posible para ser llamada como Cloud Code.
¿Necesitas hacer un pequeño cambio en la lógica? ¿O uno enorme? No hay problema.
Cambia el Cloud Code, despliégalo de nuevo y estarás como nuevo. Sin revisiones de algún tipo de otro sitio y con disponibilidad instantánea para tus clientes.
Pero de nuevo… ¿qué pasa con GraphQL?
GraphQL te permite hacer consultas. Puedes hacer consultas muy inteligentes, pero sólo consultas.
Cuando nuestro CEO, Davi, estaba discutiendo cómo hacerlo más inteligente, la integración con Cloud Code Functions parecía simplemente lógica: ¡tienes lo mejor de ambos mundos! La potencia y la inteligencia de Cloud Code Functions, y la facilidad de uso y mantenimiento de GraphQL.
A través de nuestra nueva función puede ampliar los tipos de GraphQL para ejecutar Cloud Code Functions y recuperar sus resultados.
Puede aplicar cualquier lógica de negocio que pueda imaginar a sus Funciones de Código en la Nube, incluir módulos NPM con ellas y consultarlas con GraphQL.
No hablemos más. Pongámonos manos a la obra…
Las Clases y Objetos que usaremos
Para este post, he creado dos clases distintas: Empleado y Mascota, que contendrán los empleados aquí en Back4app y sus respectivas mascotas.
Un Empleado tiene las siguientes propiedades:
- nombre (Cadena)
- edad (Número)
- email (Cadena)
- posición (Cadena)
- hasThisPet (Puntero a la clase Pet)
Una mascota tiene las siguientes propiedades:
- nombre (Cadena)
- especie (String)
Y algunas Funciones de Cloud Code
Y para nuestras Cloud Code Functions, escribiré un archivo llamado main.js e incluiré el siguiente código.
Tiene cinco Funciones Cloud Code completamente comentadas que harán:
- checkGraphQLSupport
recuperar si la App tiene soporte para GraphQL - retrieveFirstEmployeeByName
recuperar todos los detalles del primer Empleado encontrado en la base de datos con un nombre dado - recuperarTodosEmpleados
recuperar todos los detalles de todos los Empleados - retrieveOnwerOfPetByName
recuperar los detalles de un Empleado que tiene una Mascota con un nombre dado - recuperarEmpleadoPorNombreConMascota
recuperar todos los datos de un empleado y su mascota
Parse.Cloud.define("checkGraphQLSupport", async req => { /* Esta función devuelve si la aplicación tiene soporte para GraphQL. El parseGraphQLServer es verdadero cuando la aplicación tiene soporte, o falso en caso contrario. */ if (parseGraphQLServer){ return "Esta aplicación es compatible con GraphQL"; } else { return "Esta aplicación no es compatible con GraphQL. ¿Tal vez una versión incorrecta de Parse?"; } }); Parse.Cloud.define("recuperarPrimerEmpleadoPorNombre", async req => { /* Esta función recupera el primer Empleado encontrado con un nombre dado. Se recuperan todas las propiedades del empleado. Sólo se devuelve un empleado si hay más de uno en la base de datos. Si no hay empleados, se devuelve null. */ const query = new Parse.Query("Empleados"); query.equalTo("nombre", req.params.name); const result = await query.first(); return resultado; }); Parse.Cloud.define("retrieveAllEmployees", async req => { /* Esta función recupera todos los Empleados. Se recuperan todas las propiedades de la clase Empleado, pero sólo de esa clase. No se recuperan detalles de Punteros o Relaciones, sólo el objectId. Se devuelve un array de Empleados. Vacío si no hay Empleados. */ const query = new Parse.Query("Empleados"); const results = await query.find(); devolver resultados; }); Parse.Cloud.define("retrieveOnwerOfPetByName", async req => { /* Esta función recupera la información sobre el Empleado relacionada con una Mascota, por el nombre de la Mascota. Se recuperan todas las propiedades de la clase Empleado. No se obtendrán detalles de la mascota. Se devuelve un array de Mascotas. Vacío si no se encuentra ninguna mascota. */ // Primero hacemos una consulta para obtener la información sobre la mascota const petQuery = new Parse.Query("Mascota"); petQuery.equalTo("nombre", req.params.name); // A continuación, hacemos una consulta para recuperar los detalles de su onwer basado en la propiedad hasThisPet let empleadoQuery = new Parse.Query("Empleados"); employeeQuery.matchesQuery("hasThisPet", petQuery); const results = await empleadoQuery.find(); devolver resultados; }); Parse.Cloud.define("retrieveEmployeeByNameWithPet", async req => { /* Esta función recupera la información sobre el Empleado y su Mascota relacionada por el nombre del Empleado. Se recuperan todas las propiedades de la clase Empleado y de la clase Mascota. Se devuelve un array de Empleados, incluyendo una propiedad hasThisPet completamente rellenada con la información sobre la mascota. Si no se encuentra ningún empleado, se devuelve un array vacío. */ const query = new Parse.Query("Empleados"); query.equalTo("nombre", req.params.name); query.include("hasThisPet") const results = await query.find(); return resultados; });
Lo subiremos a nuestro Cloud Code Functions, en la carpeta Cloud.
Un pequeño paso extra
Las Funciones Cloud Code que acabamos de publicar ya se pueden utilizar, pero para que funcionen con GraphQL, debemos crear un archivo llamado schema.graphql y exponer esas funciones.
La sintaxis es muy simple, pero requiere atención:
extender tipo Query { GraphQLMethodName (parameterName: parameterType): ¡ ReturnType! @resolve(to:"CloudCodeFunctionName") }
Para el código anterior, la sintaxis representa
- GraphQLMethodName
Este es el nombre que llamará en su consulta GraphQL. No tiene por qué coincidir con el nombre de la función de código de la nube, pero debe elegir algo que facilite la comprensión de lo que hace ese método.
- parameterName
El nombre del parámetro que consumirá en la petición cuando esté dentro de la función de código en la nube. No tiene que pasar esto si no utiliza parámetros en su función de código en la nube.
- parameterType
El tipo de parámetro que está pasando. Puede aprender más sobre esquemas y ver todas las posibilidades. No tiene que pasarlo si no utiliza parámetros en su función de código en la nube.
- ReturnType
Este es el tipo de retorno de su método.
- CloudCodeFunctionName
Debe coincidir con el nombre de la Función de Código en la Nube que le diste en tu archivo main.js, ya que llamará a ese código por el nombre de la función.
Así, para nuestro archivo main.js que acabamos de crear, nuestro schema.graphql sería:
extend type Query { checkGraphQLSupport: String @resolve(to: "checkGraphQLSupport") recuperarEmpleadoPorNombre (nombre:String): ¡ClaseEmpleado! @resolve(to: "recuperarEmpleadoPorNombre") giveMeAllEmployees: [¡ClaseEmpleados!] @resolve(to: "recuperarTodosEmpleados") whichEmployeeIsOnwerOfThisPet (name:String): [¡ClaseEmpleados!] @resolve(to: "recuperarEncargadoDeEstaMascotaPorNombre") gatherEmployeeAndPetByEmployeeName (name:String): [ClaseEmpleados] @resolve(to: "recuperarEmpleadoPorNombreConMascota") }
No es tan difícil, ¿verdad?
Fíjate que he utilizado nombres muy extensos que no coinciden con el nombre de las Funciones de Código en la Nube sólo para que sepas que puedes renombrar cuando expongas.
Ahora vuelve a la sección Cloud Code Functions de tu App y sube ese archivo también. Asegúrese de que también está en la carpeta Cloud. Puede arrastrarlo y soltarlo allí si es necesario.
Si ya tienes un archivo con ese nombre y no puedes subir uno nuevo, puedes hacer clic con el botón derecho y eliminarlo antes de subirlo.
Despliegue todo y estamos listos para ir:
Ahora, tiempo para la magia…
Ve a tu consola GraphQL. Empieza a escribir “query” y usa la función de Autocompletar (CTRL + Barra espaciadora en Windows, OPTION + Barra espaciadora en Mac), y verás como ocurre la magia:
Todos nuestros métodos están ahí y podemos consultar cada uno de ellos. Probemos uno por uno
-
checkGraphQLSupport
(resuelve a nuestra función de código en la nube checkGraphQLSupport)
-
retrieveThisEmployeeByName (name:String)
(resuelve a nuestra función de código en la nube retrieveFirstEmployeeByName)
-
giveMeAllEmployees
(resuelve a nuestra función de código en la nube retrieveAllEmployees)
Observe en el ejemplo anterior que las propiedades nombre y edad se recuperaron correctamente, pero hasThisPet tiene valores nulos para el nombre y la especie de la mascota.
Esto se debe a que en esa Función de Código en la Nube no incluimos (usando el método include()) la información sobre la Mascota.
Autocompletar nos mostrará las posibilidades, pero no se proporcionó ningún dato para completar esa información en la Función de Código en la Nube.
Vea el ejemplo gatherEmployeeAndPetByEmployeeNameresolves más abajo para ver cómo incluir la información.
-
whichEmployeeIsOnwerOfThisPet
(resuelve a nuestra función de código en la nube retrieveOnwerOfPetByName)
-
gatherEmployeeAndPetByEmployeeName
(resuelve a nuestra función de código en la nube retrieveEmployeeByNameWithPet)
Tus increíbles definiciones fueron actualizadas
Ahora, ASÍ es como se lleva algo de lógica de negocio a GraphQL.
¡Te quiero 3000!
Conclusión
GraphQL es un potente y sencillo lenguaje de consulta multiplataforma y tiempo de ejecución, pero al fin y al cabo, es sólo un lenguaje de consulta.
Con esta nueva integración con Cloud Code Functions, le traemos lo mejor de ambos mundos, liberando el poder de Cloud Code (¡incluyendo Módulos NPM, baby!).
Ahora todo depende de usted y de su creatividad. Háganos saber qué le parece y cómo lo está utilizando en sus proyectos en los comentarios a continuación.
¿Qué es Cloud Code?
Cloud Code es básicamente Node.js. Se ejecuta desde los servidores de Back4app en lugar de los dispositivos finales. Tiene diferentes ventajas según tus necesidades: ahorra batería, permite desplegar el código más rápido y reduce el uso de datos según lo que necesites.
¿Cómo ayuda Cloud Code a ahorrar batería en el teléfono celular?
Ayuda a ahorrar batería al reducir la carga en los dispositivos. La carga de procesamiento que el dispositivo gestionaba constantemente se transferirá al código en la nube, lo que hará que el dispositivo esté más inactivo de lo habitual. Por lo tanto, a la larga, ayudará a ahorrar batería.
¿Cómo ayuda Cloud Code a ahorrar datos?
El código de la nube recuperará todos los datos que procesaste con wifi o datos móviles. Continuará redirigiendo los datos y generará informes completos en la nube. Solo recuperará el último resultado en el dispositivo, lo que resultará en una carga útil menor y un menor uso de datos.