Logica senza server con funzioni di reame

Cosa starai creando

Nelle esercitazioni precedenti, abbiamo dato un'occhiata alla piattaforma Realm e al Realm Database su dispositivo per iOS. In quel post, hai imparato a sincronizzare i tuoi dati dell'app localmente e nel cloud. Sebbene questo rappresenti una soluzione completa per molti sviluppatori, potresti voler fare qualcosa di più della semplice persistenza dei dati, ma anche eseguire la logica lato server. 

Quest'anno, Realm ha aggiunto la possibilità di creare funzionalità serverless tramite le funzioni di Realm, consentendo agli sviluppatori di creare la logica del programma per rispondere automaticamente agli eventi del database.

La soluzione di calcolo serverless di Realm è simile all'AWS Lambda di Amazon o alle funzioni di Azure di Microsoft. Come loro, ti permette di eseguire il codice senza dover eseguire il provisioning dei tuoi server. Le tue funzioni verranno eseguite su Realm Object Server. Le funzioni di Realm offrono la possibilità di scrivere funzioni basate su JavaScript che reagiscono agli oggetti live di Realm e gestirli attraverso l'interfaccia della dashboard di Realm. 

Se è necessario reagire a oggetti live e inviare una notifica push agli utenti o attivare una chiamata API a un altro SDK fornitore di terze parti come Twilio, gli eventi reattivi tramite le funzioni consentono di rispondere e reagire dal lato server. In questo tutorial, imparerai come lavorare con le funzioni di Realm.

Obiettivi di questo tutorial

In questo tutorial, imparerai come implementare e lavorare con le funzioni di Realm per creare una funzione di trigger di esempio che aggiornerà un valore nel nostro database cloud. Questo sarà un esempio forzato, ma puoi applicare questa conoscenza a problemi più pratici. 

In questo tutorial, tratteremo quanto segue:

  • gestione degli eventi e funzioni
  • motivi per usare le funzioni
  • creazione di funzioni dalla dashboard
  • integrazione di funzioni nel Realm Object Server.

Conoscenza presunta

Questo tutorial presume che tu abbia letto i due tutorial precedenti di questa serie. Poiché le funzioni di Realm sono scritte in JavaScript, dovresti anche avere una conoscenza di base di quella lingua, sebbene non sia necessario essere un esperto. 

Se vuoi un primer su Realm, controlla i post precedenti di questa serie.

Quali sono le funzioni del regno? 

Nelle esercitazioni precedenti hai utilizzato Realm per creare la persistenza sul dispositivo, oltre a sincronizzare i dati degli utenti con il cloud, ma una notevole assenza è stata la capacità di lavorare in modo intelligente con i dati sul lato server. A volte abbiamo bisogno di logica lato server in grado di rispondere alle modifiche nei dati, allo stesso modo i trigger funzionano nei database tradizionali. 

È qui che entrano in gioco le Funzioni di Reame, che forniscono la capacità di anticipare e reagire ai cambiamenti nei Regni. Le funzioni di reame hanno inoltre consentito ai team di creare logica lato server senza la necessità di uno sviluppatore back-end dedicato, basandosi sulla piattaforma Realm con una configurazione minima e senza doversi preoccupare della serializzazione o aggiungere ulteriori endpoint al server. 

Le funzioni di reame sono il nostro livello logico "senza server", in cui puoi facilmente creare funzionalità lato server con JavaScript semplice, non è richiesto alcun team di back-end. Quando i dati sincronizzati cambiano, la logica personalizzata viene eseguita, rendendo così facile e veloce per gli sviluppatori di dispositivi mobili la creazione e la distribuzione di funzionalità sofisticate dipendenti dal server. - Realm.io

Gestione degli eventi nel regno

Le funzioni gestiscono gli eventi tramite il Realm Object Server con le funzioni Node.js che vengono successivamente chiamate dall'API di ascolto globale di Realm Object Server, che passa ChangeEvent () oggetti attivati ​​tramite la logica della funzione. Ciò avviene tramite l'istanza Node.js lato server, che si collega all'API listener dell'evento globale, consentendo agli sviluppatori di osservare le modifiche su Realms e il filtraggio per specifici Realms che corrispondono a un modello Regex specifico. 

Gli sviluppatori possono quindi ascoltare percorsi Ream specifici e unici che possono essere impostati per utenti specifici e quindi reagire alle modifiche dell'utente. Il listener di eventi globale attiva quindi una notifica per le funzioni sul lato server in risposta alle modifiche. 

Il pacchetto di notifica informa i gestori di eventi sul percorso virtuale del Reame aggiornato, nonché sull'oggetto Realm o sugli oggetti che sono stati modificati. Questi sono suddivisi in base al nome della classe e agli indici degli oggetti modificati durante l'ultima transazione di sincronizzazione. 

La creazione di una funzione di gestione degli eventi Realm comporta la creazione di una piccola applicazione Node.js, con a package.json per definire l'applicazione e le sue dipendenze. Per ulteriori informazioni sulla creazione di gestori di eventi in Realm Object Server, fare riferimento alle Linee guida di Realm sulla gestione degli eventi. 

Successivamente, inizieremo a impostare la nostra prima funzione Realm. 

Impostazione della prima funzione Realm

Per gli scopi di questo tutorial, ci concentreremo su un semplice esempio di funzione per illustrare come le funzioni vengono create e integrate nella piattaforma Realm Mobile. Si presume che tu abbia già l'applicazione esistente delle esercitazioni precedenti, ospitata sul tuo Realm Object Server e in esecuzione, prima di procedere con il resto di questo tutorial. 

Per prima cosa, vai al dashboard di Realm Object Server e seleziona il funzioni scheda. In questa pagina, Realm fornisce già una funzione di esempio che è possibile abilitare ed eseguire rapidamente, nominando prima la funzione, scegliendo a quale dominio applicarla (la nostra app di lavoro in questo caso, RealmDoApp), quindi avviando l'evento della funzione ascoltatore premendo il tasto Inizio pulsante. 

Vai avanti e fallo mentre esegui la tua app iOS in Xcode Simulator e crea una nuova attività promemoria. Noterai che il registro sottostante è popolato con messaggi di registro per i diversi stati della tua app.

Diamo un'occhiata al codice di esempio in maggiore dettaglio: 

console.log ("Funzione di avvio"); // aggiungi qui il tuo codice di inizializzazione module.exports = function (changeEvent) // il codice del gestore di eventi va qui console.log ("Changes in realm at:", changeEvent.path); var realm = changeEvent.realm; for (var className in changeEvent.changes) var changes = changeEvent.changes [className]; var objects = realm.objects (className); console.log ("Modifiche nel modello:", className); for (lascia pos of changes.insertions) console.log ("- oggetto inserito nella posizione", pos, ":", objects [pos]);  for (let pos of changes.modifications) console.log ("- oggetto modificato in posizione", pos, ":", objects [pos]);  for (lascia pos of changes.deletions) console.log ("- oggetto cancellato in posizione", pos);  console.log (""); ;

La funzione inizia esponendo il metodo di consegna degli eventi attraverso le esportazioni. Le funzioni di gestione degli eventi richiedono a ChangeEvent come loro parametro. Questa semplice funzione emette solo il changeEvent.path alla console, mostrando ciò che viene cambiato esattamente. 

Quindi otteniamo un riferimento al regno cambiato attraverso il ChangeEvent oggetto, quindi ottenere un elenco di oggetti e modifiche. Eseguiamo un record di tutti gli inserimenti, le modifiche e le eliminazioni sulla console. 

Estensione della funzione semplice

Questa funzione di esempio non è realmente funzionale, ma per consolidare la nostra comprensione di cosa è possibile fare con le funzioni, prendiamo un po 'più la funzione e personalizzatela. 

Poiché si tratta di un'applicazione Node.js, possiamo lavorare con le librerie Node.js di terze parti. In questo caso, useremo una libreria chiamata libphonenumber e modificheremo la nostra funzione per analizzare le voci come numeri di telefono, con la formattazione corretta e il prefisso internazionale. 

Prima di immettere il codice seguente, installare la libreria di terze parti immettendo quanto segue nel Realm Object Server:

npm installa google-libphonenumber --save

stampa Stop nella console per interrompere la funzione in esecuzione, quindi modificare la funzione con il seguente codice:

var PNF = require ('google-libphonenumber'). PhoneNumberFormat; var phoneUtil = require ('google-libphonenumber'). PhoneNumberUtil.getInstance (); console.log ("Funzione di avvio"); // aggiungi qui il tuo codice di inizializzazione module.exports = function (change_event) var realm = change_event.realm; var changes = change_event.changes.Reminder; var taskIndexes = changes.modifications; console.log ("Modifica rilevata:" + cambia + "per taskindexes", taskIndexes); // Recupera gli oggetti compito sui processi var reminders = realm.objects ("Promemoria"); var promemoria = promemoria [reminders.length - 1]; // Recupera l'oggetto task dal reame con l'indice console.log ("Nuova attività ricevuta:" + change_event.path); console.log ("Promemoria attività", promemoria); // ottieni la data da wit.ai // probabilmente usa questo 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 ("Not a phone number"); ritorno;  console.log ("Telefono convertito in", phoneUtil.format (phoneNumber, PNF.INTERNATIONAL)); realm.write (function () reminder.name = phoneUtil.format (phoneNumber, PNF.INTERNATIONAL);); ;

Nel codice sopra, stiamo creando un riferimento di istanza alla libreria di terze parti google-libphonenumber, e poi ottenere un elenco degli oggetti promemoria tramite realm.objects ( "Promemoria"). Quindi otteniamo un riferimento all'ultimo promemoria dell'array, poiché è il più recente e quindi converte i suoi dati in un numero di telefono. 

Eseguiremo il risultato di ciò alla console, prima di scrivere effettivamente la versione formattata dei dati sul reame, tramite:

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

Dare un'altra funzione alla funzione riavviandola e, in iOS Simulator, inserire un numero di telefono che non è formattato correttamente, ad esempio 17187998177. Attraverso il log della console e l'output finale sull'app, è necessario formattare correttamente il numero utilizzando la libreria di terze parti, con la spaziatura e il prefisso internazionale come segue:

+1 718-799 8177

Quello che stiamo vedendo qui è un modo serverless di innescare un evento per una modifica (inserimento) e formattare i dati prima di persistere nel cloud.

Specifica delle espressioni regolari del percorso URL Realm

Nella nostra funzione dashboard, abbiamo semplicemente indicato un'applicazione Realm specifica, RealmDo, ma puoi anche definire un'espressione regolare (regex) per distinguere in modo univoco quali percorsi attivano la funzione. Per abbinare per tutti i reami, useresti .* (che corrisponde a zero o più di qualsiasi carattere). Oppure potresti abbinare un Reame di proprietà dell'utente con ^ / ([0-9a-f] +) / promemoria $.

Conclusione

Le funzioni di Realm creano nuove possibilità per la Realm Mobile Platform fornendo un modo semplice ed elegante per aggiungere una logica serverless in grado di rispondere ai cambiamenti in Realm. Attraverso la Dashboard, gli sviluppatori possono creare funzioni che rispondono ai cambiamenti in tutti i reami, o solo su percorsi specifici. 

In questo tutorial, hai imparato un po 'su quali sono le funzioni di Realm e come forniscono un ambiente di sviluppo olistico non solo per la creazione e la persistenza dei dati, ma anche per aggiungere logica ad esso. Abbiamo esteso la funzione predefinita e chiamato una libreria JavaScript di terze parti per convertire i numeri di telefono. 

Sebbene il nostro esempio sia un po 'forzato, ti dà un'idea di cosa puoi fare per gestire gli oggetti Realm quando vengono inseriti, modificati o cancellati. Questo è come il modo in cui i database tradizionali sfruttano i trigger, solo server-less e con codice minimo, come puoi vedere. 

Mentre sei qui, dai uno sguardo agli altri post di sviluppo iOS qui su Envato Tuts+.