Lógica sin servidor con funciones de reino

Lo que vas a crear

En los tutoriales anteriores, echamos un vistazo a la plataforma Realm, así como a la base de datos Realm en el dispositivo para iOS. En esa publicación, aprendiste cómo sincronizar los datos de tu aplicación tanto localmente como en la nube. Si bien esto presenta una solución completa para muchos desarrolladores, es posible que desee hacer algo más que solo conservar los datos, pero también ejecutar la lógica del lado del servidor.. 

Este año, Realm agregó la capacidad de crear una funcionalidad sin servidor a través de Realm Functions, permitiendo a los desarrolladores crear una lógica de programa para responder a los eventos de la base de datos automáticamente..

La solución de computación sin servidor de Realm es similar a AWS Lambda de Amazon o Azure Functions de Microsoft. Al igual que ellos, le permite ejecutar código sin tener que aprovisionar sus propios servidores. Sus funciones se ejecutarán en Realm Object Server. Las funciones de Realm ofrecen la posibilidad de escribir funciones basadas en JavaScript que reaccionan a los objetos vivos de Realm y las administran a través de la interfaz del panel de control de Realm. 

Ya sea que necesite reaccionar a los objetos vivos y enviar una notificación de inserción a los usuarios o activar una llamada a la API a un SDK de otro proveedor como Twilio, los eventos reactivos a través de funciones le permiten responder y reaccionar desde el lado del servidor. En este tutorial, aprenderá a trabajar con Realm Functions.

Objetivos de este tutorial

En este tutorial, aprenderá cómo implementar y trabajar con Realm Functions para crear una función de disparo de ejemplo que actualizará un valor en nuestra base de datos en la nube. Este será un ejemplo artificial, pero puede aplicar este conocimiento a problemas más prácticos.. 

En este tutorial, estaremos cubriendo lo siguiente:

  • manejo de eventos y funciones
  • razones para usar funciones
  • Creando funciones desde el tablero.
  • integrando funciones en su Realm Object Server.

Conocimiento asumido

Este tutorial asume que has leído los dos tutoriales anteriores de esta serie. Como Realm Functions está escrito en JavaScript, también debe tener un conocimiento básico de ese idioma, aunque no necesita ser un experto.. 

Si quieres una introducción a Realm, consulta las publicaciones anteriores de esta serie..

¿Qué son las funciones del reino?? 

En los tutoriales anteriores, ha utilizado Realm para crear persistencia en el dispositivo, así como para sincronizar los datos del usuario con la nube, pero una notable ausencia ha sido la capacidad de trabajar de manera inteligente con el servidor de datos. A veces necesitamos una lógica del lado del servidor que pueda responder a los cambios en los datos, de la misma manera que los activadores funcionan en las bases de datos tradicionales. 

Aquí es donde entra en juego Realm Functions, que brinda la capacidad de anticipar y reaccionar a los cambios en Realms. Realm Functions también permitió a los equipos crear una lógica del lado del servidor sin necesidad de un desarrollador de back-end dedicado, construyendo sobre la plataforma Realm con una configuración mínima y sin tener que preocuparse por la serialización o agregar puntos finales adicionales al servidor. 

Realm Functions es nuestra capa lógica de aplicación "sin servidor", donde puede crear fácilmente características del lado del servidor con JavaScript simple, sin necesidad de un equipo de back-end. Cuando los datos sincronizados cambian, su lógica personalizada se ejecuta, lo que hace que los desarrolladores móviles puedan crear y enviar características sofisticadas que dependen del servidor. - realm.io

Manejo de eventos en el reino

Las funciones gestionan los eventos a través del servidor de objetos de Realm con funciones de Node.js que posteriormente son llamadas por la API de escucha global del servidor de objetos de Realm, que pasa changeEvent () Objetos disparados a través de la función lógica. Esto se logra a través de la instancia de Node.js del lado del servidor, que se conecta a la API del detector de eventos global, lo que permite a los desarrolladores observar los cambios en los reinos y filtrar los reinos específicos que coinciden con un patrón Regex específico. 

Por lo tanto, los desarrolladores pueden escuchar rutas de Reino específicas y únicas que pueden configurarse para usuarios específicos, y luego reaccionar a los cambios de esos usuarios. El detector de eventos global luego activa una notificación para que las funciones del lado del servidor respondan a los cambios.. 

El paquete de notificación informa a los manejadores de eventos sobre la ruta virtual del Reino actualizado, así como el objeto o los objetos del Reino que han cambiado. Estos se desglosan por nombre de clase e índices de objeto modificados durante la última transacción de sincronización. 

La creación de una función de gestión de eventos de reino implica la creación de una pequeña aplicación Node.js, con un paquete.json Para definir la aplicación y sus dependencias. Para obtener más información sobre la creación de controladores de eventos en Realm Object Server, consulte las Directrices de Realm sobre manejo de eventos.. 

A continuación, comenzaremos a configurar nuestra primera función de Reino.. 

Configuración de su primera función de reino

A los efectos de este tutorial, nos centraremos en un ejemplo de función simple para ilustrar cómo se crean las funciones y cómo se integran en la plataforma móvil de Realm. Se supone que ya tiene la aplicación existente de los tutoriales anteriores, alojada en su servidor de objetos de Realm y en ejecución, antes de continuar con el resto de este tutorial.. 

Primero, diríjase al panel de control de Realm Object Server y seleccione Funciones lengüeta. En esta página, Realm ya le proporciona una función de ejemplo que puede habilitar y ejecutar rápidamente, primero asignando un nombre a la función, eligiendo a qué Reino aplicará (nuestra aplicación de trabajo en este caso, RealmDoApp), y luego iniciando el evento de la función oyente pulsando el comienzo botón. 

Continúe y haga eso mientras ejecuta su aplicación iOS en Xcode Simulator y cree una nueva tarea de recordatorio. Notará que el registro siguiente se está llenando con mensajes de registro para los diferentes estados de su aplicación.

Echemos un vistazo al código de muestra con mayor detalle: 

console.log ("Función de inicio"); // agregue su código de inicialización aquí module.exports = function (changeEvent) // el código del controlador de eventos va aquí console.log ("Cambios en el dominio en:", changeEvent.path); var realm = changeEvent.realm; para (var className en changeEvent.changes) var changes = changeEvent.changes [className]; var objects = realm.objects (className); console.log ("Cambios en el modelo:", className); para (deje pos de changes.insertions) console.log ("- objeto insertado en la posición", pos, ":", objetos [pos]);  para (deje pos de cambios.modificaciones) console.log ("- objeto modificado en la posición", pos, ":", objetos [pos]);  para (deje pos de changes.deletions) console.log ("- objeto eliminado en posición", pos);  console.log (""); ;

La función comienza exponiendo el método de manejo de eventos a través de las exportaciones. Las funciones de manejo de eventos toman un cambiarEvento como su parametro Esta simple función simplemente genera el changeEvent.path a la consola, mostrando lo que se está cambiando exactamente. 

Luego obtenemos una referencia al reino cambiado a través del cambiarEvento objeto, y luego obtener una lista de objetos y cambios. Realizamos un registro de todas las inserciones, modificaciones y eliminaciones en la consola.. 

Extendiendo la función simple

Esta función de muestra no es realmente funcional, pero para solidificar nuestra comprensión de lo que es posible hacer con las funciones, vamos a llevar la función un poco más allá y personalizarla.. 

Ya que es una aplicación Node.js, podemos trabajar con bibliotecas Node.js de terceros. En este caso, usaremos una biblioteca llamada libphonenumber y modificaremos nuestra función para analizar entradas como números de teléfono, con el formato correcto y el prefijo internacional.. 

Antes de ingresar el código a continuación, instale la biblioteca de terceros ingresando lo siguiente en el servidor de objetos de Realm:

npm instala google-libphonenumber --save

prensa Detener en la consola para detener la función en ejecución, y luego modifíquela con el siguiente código:

var PNF = require ('google-libphonenumber'). PhoneNumberFormat; var phoneUtil = require ('google-libphonenumber'). PhoneNumberUtil.getInstance (); console.log ("Función de inicio"); // agregue su código de inicialización aquí module.exports = function (change_event) var realm = change_event.realm; cambios var = change_event.changes.Reminder; var taskIndexes = changes.modifications; console.log ("Cambio detectado:" + cambios + "para los índices de tarea", índice de tarea); // Obtener los objetos de la tarea para procesar var recordatorios = realm.objects ("Recordatorio"); recordatorio de var = recordatorios [recordatorios.longitud - 1]; // Recuperar el objeto de tarea del Reino con el índice console.log ("Nueva tarea recibida:" + change_event.path); console.log ("Recordatorio de tarea", recordatorio); // obtener la fecha de wit.ai // probablemente use este https://wit.ai/docs/http/20160526#get--message-link // node-wit: https://github.com/wit-ai / node-wit var phoneNumber = phoneUtil.parse (reminder.name, 'US'); if (! phoneNumber) console.log ("No es un número de teléfono"); regreso;  console.log ("Teléfono convertido a", phoneUtil.format (phoneNumber, PNF.INTERNATIONAL)); realm.write (function () reminder.name = phoneUtil.format (phoneNumber, PNF.INTERNATIONAL);); ;

En el código anterior, estamos creando una referencia de instancia a la biblioteca de terceros número de google-libphon, y luego obtener una lista de los objetos recordatorios a través de realm.objects ("Recordatorio"). Luego obtenemos una referencia al último recordatorio de la matriz, ya que es el más reciente, y luego convertimos sus datos a un número de teléfono.. 

Enviaremos el resultado de eso a la consola, antes de volver a escribir la versión formateada de los datos en el reino, a través de:

realm.write (function () reminder.name = phoneUtil.format (phoneNumber, PNF.INTERNATIONAL);); ;

Dale otra vuelta a la función reiniciándola y, en el simulador de iOS, ingresa un número de teléfono que no esté formateado correctamente, por ejemplo 17187998177. A través del registro de la consola y la salida final de la aplicación, debe formatear el número correctamente utilizando la biblioteca de terceros, con el espaciado y el prefijo internacional de la siguiente manera:

+1 718-799 8177

Lo que estamos viendo aquí es una forma sin servidor de desencadenar un evento para un cambio (inserción) y formatear los datos antes de conservarlos en la nube..

Especificar las expresiones regulares de la ruta URL del reino

En nuestra función de panel de control, simplemente señalamos una aplicación de Realm específica, RealmDo, pero también puede definir una expresión regular (expresión regular) para distinguir de forma más exclusiva qué rutas activan la función. Para que coincida con todos los reinos, usaría .* (que coincida con cero o más de cualquier carácter). O puedes hacer coincidir un Reino propiedad del usuario con ^ / ([0-9a-f] +) / Recordatorio $.

Conclusión

Realm Functions crea nuevas posibilidades para la plataforma móvil de Realm al proporcionar una manera simple y elegante de agregar lógica sin servidor que es capaz de responder a los cambios en los reinos. A través del Tablero, los desarrolladores pueden crear funciones que respondan a los cambios en todos los Reinos, o solo en rutas específicas. 

En este tutorial, aprendió un poco sobre qué son Realm Functions y cómo proporcionan un entorno de desarrollo holístico no solo para crear y conservar datos, sino también para agregarle lógica. Ampliamos la función predeterminada y llamamos a una biblioteca de JavaScript de terceros para convertir números de teléfono.. 

Si bien nuestro ejemplo es un poco artificial, le brinda una idea de lo que puede hacer para administrar los objetos de Reino cuando se insertan, modifican o eliminan. Esto es así como las bases de datos tradicionales aprovechan los activadores, solo sin servidor y con un código mínimo, como puede ver. 

Mientras esté aquí, eche un vistazo a algunas de nuestras otras publicaciones de desarrollo de iOS aquí en Envato Tuts+.