Serverlose Logik mit Realm-Funktionen

Was Sie erstellen werden

In den vorherigen Tutorials haben wir uns die Realm-Plattform sowie die Realm-Datenbank für iOS auf dem Gerät angesehen. In diesem Beitrag haben Sie erfahren, wie Sie Ihre App-Daten sowohl lokal als auch in der Cloud synchronisieren. Während dies für viele Entwickler eine vollständige Lösung darstellt, möchten Sie möglicherweise mehr als nur Daten beibehalten, sondern auch serverseitige Logik ausführen. 

In diesem Jahr hat Realm die Möglichkeit geschaffen, serverlose Funktionen über Realm-Funktionen zu erstellen, sodass Entwickler Programmlogik erstellen können, die automatisch auf Datenbankereignisse reagiert.

Die Serverless Computing-Lösung von Realm ähnelt der von Amazon AWS Lambda oder den Azure-Funktionen von Microsoft. Ebenso wie diese können Sie Code ausführen, ohne eigene Server einrichten zu müssen. Ihre Funktionen werden auf Realm Object Server ausgeführt. Realm-Funktionen bieten die Möglichkeit, JavaScript-Funktionen zu schreiben, die auf Realm-Live-Objekte reagieren und diese über die Realm-Dashboard-Oberfläche verwalten. 

Unabhängig davon, ob Sie auf Live-Objekte reagieren und eine Push-Benachrichtigung an Benutzer senden oder einen API-Aufruf an ein SDK eines anderen Herstellers wie Twilio auslösen müssen, reaktive Ereignisse über Funktionen ermöglichen es Ihnen, serverseitig zu reagieren und zu reagieren. In diesem Tutorial lernen Sie, wie Sie mit Realm Functions arbeiten.

Ziele dieses Tutorials

In diesem Lernprogramm erfahren Sie, wie Sie Realm-Funktionen implementieren und damit arbeiten, um eine Beispiel-Triggerfunktion zu erstellen, mit der ein Wert in unserer Cloud-Datenbank aktualisiert wird. Dies wird ein erfundenes Beispiel sein, aber Sie können dieses Wissen auf praktische Probleme anwenden. 

In diesem Tutorial behandeln wir Folgendes:

  • Ereignisbehandlung und -funktionen
  • Gründe für die Verwendung von Funktionen
  • Erstellen von Funktionen über das Dashboard
  • Integrieren von Funktionen in Ihren Realm Object Server.

Angenommenes Wissen

In diesem Lernprogramm wird davon ausgegangen, dass Sie die beiden vorherigen Lernprogramme dieser Serie gelesen haben. Da Realm-Funktionen in JavaScript geschrieben sind, sollten Sie auch über Grundkenntnisse dieser Sprache verfügen, obwohl Sie kein Experte sein müssen. 

Wenn Sie eine Grundierung in Realm wünschen, sehen Sie sich die vorherigen Beiträge dieser Serie an.

Was sind Realm-Funktionen?? 

In den vorherigen Lernprogrammen haben Sie Realm verwendet, um Persistenz auf dem Gerät zu erstellen und Benutzerdaten mit der Cloud zu synchronisieren. Eine Abwesenheit war jedoch die Fähigkeit, auf der Serverseite intelligent zu arbeiten. Manchmal benötigen wir serverseitige Logik, die auf Änderungen in den Daten reagieren kann, genauso wie bei herkömmlichen Datenbanken. 

Hier kommen Realm-Funktionen ins Spiel, die die Möglichkeit bieten, Änderungen in Realms zu antizipieren und darauf zu reagieren. Realm Functions ermöglichte Teams außerdem die Entwicklung serverseitiger Logik, ohne dass ein dedizierter Back-End-Entwickler erforderlich ist. Sie müssen auf der Realm-Plattform mit minimaler Konfiguration aufbauen und müssen sich keine Gedanken über die Serialisierung oder das Hinzufügen zusätzlicher Endpunkte zum Server machen. 

Realm Functions ist unsere "serverlose" App-Logikschicht, in der Sie mit einfachem JavaScript serverseitige Funktionen erstellen können, ohne dass ein Backend-Team erforderlich ist. Wenn sich synchronisierte Daten ändern, wird Ihre benutzerdefinierte Logik ausgeführt, sodass mobile Entwickler schnell und einfach ausgefeilte serverbezogene Funktionen erstellen und bereitstellen können. - Realm.io

Ereignisbehandlung in Realm

Funktionen behandeln Ereignisse über den Realm Object Server mit Node.js-Funktionen, die anschließend von der globalen Listening-API des Realm Object Server aufgerufen werden, die die Passing-Funktion durchläuft changeEvent () Objekte, die über die Funktionslogik ausgelöst werden. Dies wird durch die serverseitige Node.js-Instanz erreicht, die eine Verbindung mit der API für globale Ereignislistener herstellt, sodass Entwickler Änderungen in Realms beobachten und nach bestimmten Realms filtern können, die einem bestimmten Regex-Muster entsprechen. 

Entwickler können daher bestimmte und eindeutige Realm-Pfade abhören, die für bestimmte Benutzer eingerichtet werden können, und dann auf die Änderungen dieses Benutzers reagieren. Der globale Ereignislistener löst dann eine Benachrichtigung aus, mit der die serverseitigen Funktionen auf die Änderungen reagieren. 

Das Benachrichtigungspaket informiert die Event-Handler über den virtuellen Pfad des aktualisierten Realms sowie über das Realm-Objekt oder die Objekte, die sich geändert haben. Diese werden nach Klassennamen und Objektindizes aufgegliedert, die während der letzten Synchronisationstransaktion geändert wurden. 

Das Erstellen einer Realm-Ereignisbehandlungsfunktion umfasst das Erstellen einer kleinen Node.js-Anwendung mit einem package.json um die Anwendung und ihre Abhängigkeiten zu definieren. Weitere Informationen zum Erstellen von Ereignishandlern in Realm Object Server finden Sie in den Realm-Richtlinien zur Ereignisbehandlung. 

Als Nächstes beginnen wir mit der Einrichtung unserer ersten Realm-Funktion. 

Einrichten der ersten Realm-Funktion

In diesem Tutorial konzentrieren wir uns auf ein einfaches Funktionsbeispiel, das veranschaulicht, wie Funktionen erstellt und in die Realm Mobile-Plattform integriert werden. Es wird davon ausgegangen, dass Sie bereits über die vorhandene Anwendung aus den vorherigen Lernprogrammen verfügen, die auf Ihrem Realm Object Server gehostet ist und ausgeführt wird, bevor Sie mit dem Rest dieses Lernprogramms fortfahren. 

Gehen Sie zuerst zum Realm Object Server-Dashboard und wählen Sie die Option Funktionen Tab. Auf dieser Seite bietet Realm bereits eine Beispielfunktion, die Sie aktivieren und schnell ausführen können, indem Sie zunächst die Funktion benennen, auswählen, auf welchen Realm sie angewendet werden soll (unsere funktionierende App in diesem Fall RealmDoApp) und dann das Funktionsereignis starten Hörer durch Drücken der Start Taste. 

Fahren Sie fort und tun Sie dies, während Sie Ihre iOS-App im Xcode Simulator ausführen, und erstellen Sie eine neue Erinnerungsaufgabe. Sie werden feststellen, dass das Protokoll unten mit Protokollnachrichten für die verschiedenen Status Ihrer App gefüllt wird.

Schauen wir uns den Beispielcode genauer an: 

console.log ("Startfunktion"); // füge hier deinen Initialisierungscode hinzu module.exports = function (changeEvent) // Event-Handler-Code geht hier console.log ("Änderungen im Realm um:", changeEvent.path); var realm = changeEvent.realm; for (var Klassenname in changeEvent.changes) var changes = changeEvent.changes [Klassenname]; var objects = realm.objects (Klassenname); console.log ("Änderungen im Modell:", Klassenname); for (let pos of changes.insertions) console.log ("- Objekt an Position eingefügt", pos, ":", objects [pos]);  for (let pos of changes.modifications) console.log ("- Objekt geändert an Position", Pos, ":", Objekte [Pos]);  for (let pos von changes.deletions) console.log ("- Objekt an Position gelöscht", pos);  console.log (""); ;

Die Funktion beginnt damit, dass die Ereignisbehandlungsmethode durch Exporte verfügbar gemacht wird. Ereignisbehandlungsfunktionen benötigen a changeEvent als ihr Parameter. Diese einfache Funktion gibt nur das aus changeEvent.path auf der Konsole, um anzuzeigen, was genau geändert wird. 

Wir erhalten dann einen Verweis auf das veränderte Reich durch changeEvent Objekt, und erhalten Sie eine Liste mit Objekten und Änderungen. Wir geben eine Aufzeichnung aller Einfügungen, Änderungen und Löschungen an der Konsole aus. 

Erweiterung der einfachen Funktion

Diese Beispielfunktion ist nicht wirklich funktional, aber um unser Verständnis der Funktionen, die mit Funktionen möglich sind, zu festigen, wollen wir die Funktion ein wenig weiterführen und anpassen. 

Da es sich um eine Node.js-Anwendung handelt, können wir mit Node.js-Bibliotheken von Drittanbietern arbeiten. In diesem Fall verwenden wir eine Bibliothek mit dem Namen libphonennummer und ändern unsere Funktion, um Einträge als Telefonnummern mit der richtigen Formatierung und dem internationalen Präfix zu analysieren. 

Installieren Sie die Drittanbieter-Bibliothek vor der Eingabe des Codes, indem Sie Folgendes in den Realm Object Server eingeben:

npm install google-libphonennummer --save

Drücken Sie Halt Beenden Sie die Funktion in der Konsole, und ändern Sie die Funktion mit folgendem Code:

var PNF = required ("google-libphonennummer"). PhoneNumberFormat; var phoneUtil = required ('google-libphonennummer'). PhoneNumberUtil.getInstance (); console.log ("Startfunktion"); // füge hier deinen Initialisierungscode hinzu module.exports = function (change_event) var realm = change_event.realm; var changes = change_event.changes.Reminder; var taskIndexes = changes.modifications; console.log ("Änderung erkannt:" + changes + "für taskindexes", taskIndexes); // Holen Sie sich die Aufgabenobjekte für Prozesse var erinnerungen = realm.objects ("Erinnerung"); var reminder = erinnerungen [erinnerungen.längen - 1]; // Abrufen des Aufgabenobjekts aus dem Realm mit dem Index console.log ("Neue Aufgabe erhalten:" + change_event.path); console.log ("Task Reminder", Erinnerung); // Datum von wit.ai abrufen // Verwenden Sie wahrscheinlich 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 ("Keine Telefonnummer"); Rückkehr;  console.log ("Telefon wurde konvertiert in", phoneUtil.format (phoneNumber, PNF.INTERNATIONAL)); realm.write (function () reminder.name = phoneUtil.format (phoneNumber, PNF.INTERNATIONAL);); ;

Im obigen Code erstellen wir eine Instanzreferenz auf die Bibliothek von Drittanbietern google-libphonennummer, und dann eine Liste der Erinnerungsobjekte über realm.objects ("Erinnerung"). Dann erhalten wir einen Verweis auf die letzte Erinnerung im Array, da diese die letzte ist, und konvertieren dann ihre Daten in eine Telefonnummer. 

Das Ergebnis wird an die Konsole ausgegeben, bevor die formatierte Version der Daten tatsächlich in den Realm zurückgeschrieben wird:

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

Wenden Sie die Funktion erneut an, indem Sie sie neu starten, und geben Sie im iOS-Simulator eine Telefonnummer ein, die nicht ganz richtig formatiert ist, beispielsweise 17187998177. Über das Konsolenprotokoll und die endgültige Ausgabe in der App sollte die Nummer mithilfe der Drittanbieter-Bibliothek korrekt formatiert werden. Der Abstand und das internationale Präfix lauten wie folgt:

+1 718–799 8177

Was wir hier sehen, ist eine serverlose Methode, um ein Ereignis für eine Änderung (Einfügung) auszulösen und die Daten zu formatieren, bevor sie in der Cloud gespeichert werden.

Festlegen von regulären Ausdrücken des Realm-URL-Pfads

In unserer Dashboard-Funktion haben wir lediglich auf eine bestimmte Realm-Anwendung, RealmDo, verwiesen. Sie können jedoch auch einen regulären Ausdruck (Regex) definieren, um eindeutiger zu bestimmen, welche Pfade die Funktion auslösen. Um für alle Realms zu passen, würden Sie verwenden .* (die mit keinem oder mehreren beliebigen Zeichen übereinstimmt). Oder Sie könnten mit einem eigenen Realm mit übereinstimmen ^ / ([0-9a-f] +) / Erinnerung $.

Fazit

Realm-Funktionen schaffen neue Möglichkeiten für die Realm Mobile-Plattform, indem sie auf einfache und elegante Weise eine serverlose Logik hinzufügen, die auf Änderungen in Realms reagieren kann. Über das Dashboard können Entwickler Funktionen erstellen, die auf Änderungen in allen Realms oder nur auf bestimmten Pfaden reagieren. 

In diesem Lernprogramm haben Sie ein wenig darüber erfahren, was Realm Functions sind und wie sie eine ganzheitliche Entwicklungsumgebung bereitstellen, nicht nur für das Erstellen und Bestehen von Daten, sondern auch für das Hinzufügen von Logik. Wir haben die Standardfunktion erweitert und eine JavaScript-Bibliothek eines Drittanbieters aufgerufen, um Telefonnummern umzuwandeln. 

Unser Beispiel ist zwar ein wenig durchdacht, aber Sie erhalten eine Vorstellung davon, wie Sie Realm-Objekte beim Einfügen, Ändern oder Löschen verwalten können. Dies ist genau so, wie traditionelle Datenbanken Trigger nutzen, nur ohne Server und mit minimalem Code, wie Sie sehen können. 

Werfen Sie einen Blick auf einige unserer anderen iOS-Entwicklungsposten hier auf Envato Tuts+.