Serverloze logica met Realm-functies

Wat je gaat creëren

In de vorige tutorials hebben we zowel het Realm-platform als de on-device Realm Database voor iOS bekeken. In die post hebt u geleerd hoe u uw app-gegevens zowel lokaal als in de cloud kunt synchroniseren. Hoewel dit een complete oplossing biedt voor veel ontwikkelaars, wilt u misschien meer doen dan alleen maar gegevens behouden, maar ook logica op de server uitvoeren. 

Dit jaar heeft Realm de mogelijkheid toegevoegd om serverloze functionaliteit te creëren via Realm Functions, waardoor ontwikkelaars een programmalogica kunnen maken om automatisch te reageren op database-evenementen.

De serverloze computeroplossing van Realm is verwant aan Amazon's AWS Lambda of de Azure-functies van Microsoft. Net als zij kunt u code uitvoeren zonder dat u uw eigen servers hoeft aan te schaffen. Uw functies worden uitgevoerd op Realm Object Server. Realm-functies bieden de kans om op JavaScript gebaseerde functies te schrijven die reageren op Realm's live-objecten en deze te beheren via de Realm-dashboardinterface. 

Of u nu op live-objecten wilt reageren en een pushmelding naar gebruikers wilt verzenden of een API-aanroep wilt verzenden naar een SDK van een andere leverancier zoals Twilio, reactieve gebeurtenissen via functies stellen u in staat te reageren en aan de server te reageren. In deze tutorial leer je hoe je met Realm Functions kunt werken.

Doel van deze zelfstudie

In deze zelfstudie leert u hoe u Realm Functions kunt implementeren en ermee kunt werken om een ​​voorbeeldtrigefunctie te maken die een waarde in onze clouddatabase zal bijwerken. Dit is een gekunsteld voorbeeld, maar je kunt deze kennis toepassen op meer praktische problemen. 

In deze zelfstudie behandelen we het volgende:

  • afhandeling van evenementen en functies
  • redenen om functies te gebruiken
  • functies maken vanuit het dashboard
  • functies integreren in uw Realm Object Server.

Aangenomen kennis

Deze tutorial gaat ervan uit dat je de vorige twee tutorials in deze serie hebt gelezen. Omdat Realm Functions zijn geschreven in JavaScript, moet u ook een basiskennis hebben van die taal, hoewel u geen expert hoeft te zijn. 

Als je een primer op Realm wilt, bekijk dan de vorige berichten in deze serie.

Wat zijn Realm-functies? 

In de vorige zelfstudies hebt u Realm gebruikt om persistentie op het apparaat te maken en gebruikersgegevens te synchroniseren met de cloud, maar een opmerkelijke afwezigheid was de mogelijkheid om op een intelligente manier met gegevensserver te werken. We hebben soms serverlogica nodig die kan reageren op wijzigingen in de gegevens, op dezelfde manier als triggers werken in traditionele databases. 

Dit is waar Realm Functions binnenkomen, die de mogelijkheid bieden om te anticiperen op en te reageren op veranderingen in Realms. Realm Functions stelde teams ook in staat om server-side logica te creëren zonder een speciale back-end ontwikkelaar nodig te hebben, bouwend op het Realm Platform met minimale configuratie, en zonder zich zorgen te hoeven maken over serialisatie of extra eindpunten toe te voegen aan de server. 

Realm Functions is onze "serverloze" app-logica-laag, waar u gemakkelijk server-side functies kunt bouwen met eenvoudig JavaScript, geen backend-team nodig. Wanneer gesynchroniseerde gegevens worden gewijzigd, wordt uw aangepaste logica uitgevoerd, zodat mobiele ontwikkelaars snel en gemakkelijk geavanceerde serverafhankelijke functies kunnen bouwen en verzenden. - Realm.io

Gebeurtenisafhandeling in realm

Functies verwerken gebeurtenissen via de Realm Object Server met Node.js-functies die vervolgens worden aangeroepen door de Global listening API van Realm Object Server, die wordt doorgegeven ChangeEvent () objecten geactiveerd via de functie logica. Dit wordt bereikt via de Node.js-instantie aan de serverzijde, die verbinding maakt met de API voor de algemene gebeurtenislistener, waardoor ontwikkelaars kunnen observeren voor wijzigingen in realms en voor specifieke domeinen die overeenkomen met een specifiek Regex-patroon. 

Ontwikkelaars kunnen daarom luisteren naar specifieke en unieke realm-paden die mogelijk zijn ingesteld voor specifieke gebruikers en vervolgens reageren op de wijzigingen van die gebruiker. De globale gebeurtenislistener activeert vervolgens een melding voor de functies aan de serverzijde om op de wijzigingen te reageren. 

Het kennisgevingspakket informeert de gebeurtenishandlers over het virtuele pad van de bijgewerkte realm, evenals het Realm-object of objecten die zijn gewijzigd. Deze worden uitgesplitst op klassennaam en objectindexen die tijdens de laatste synchronisatietransactie zijn gewijzigd. 

Het maken van een realm-gebeurtenisafhandelingsfunctie omvat het maken van een kleine Node.js-applicatie, met een package.json om de applicatie en de afhankelijkheden ervan te definiëren. Raadpleeg de Realm-richtlijnen voor het afhandelen van gebeurtenissen voor meer informatie over het maken van gebeurtenishandlers in Realm Object Server. 

Vervolgens beginnen we met het instellen van onze eerste Realm-functie. 

Uw eerste realm-functie instellen

Voor de doeleinden van deze tutorial gaan we ons richten op een eenvoudig functioneringsvoorbeeld om te illustreren hoe functies worden gecreëerd en geïntegreerd in het Realm Mobile Platform. Er wordt van uitgegaan dat u de bestaande toepassing van de vorige zelfstudies al hebt gehost op uw Realm Object Server en wordt uitgevoerd voordat u verder gaat met de rest van deze zelfstudie. 

Ga eerst naar het Realm Object Server-dashboard en selecteer het functies tab. Op deze pagina biedt Realm u al een voorbeeldfunctie die u snel kunt inschakelen en uitvoeren, door eerst de functie te benoemen, de realm te kiezen om deze toe te passen (onze werkende app in dit geval, RealmDoApp) en vervolgens de functiegebeurtenis te starten luisteraar door op te drukken Begin knop. 

Ga je gang en doe dat terwijl je je iOS-app in Xcode Simulator uitvoert en een nieuwe herinneringstaak maakt. U zult zien dat het onderstaande logbestand vol zit met logberichten voor de verschillende toestanden van uw app.

Laten we de voorbeeldcode eens nader bekijken: 

console.log ("startfunctie"); // voeg hier uw initialisatiecode toe module.exports = function (changeEvent) // gebeurtenishandlercode gaat hier 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 ("Changes in Model:", className); for (let pos changes.insertions) console.log ("- object ingevoegd op positie", pos, ":", objecten [pos]);  for (let op changes.modifications) console.log ("- object gewijzigd op positie", pos, ":", objecten [pos]);  voor (let op changes.deletions) console.log ("- object verwijderd op positie", pos);  console.log (""); ;

De functie begint met het blootstellen van de methode voor het overhandigen van de gebeurtenis via exports. Gebeurtenisafhandelingsfuncties nemen een ChangeEvent als hun parameter. Deze eenvoudige functie voert gewoon de changeEvent.path naar de console, om te laten zien wat precies wordt gewijzigd. 

We krijgen dan een verwijzing naar het veranderde rijk door de ChangeEvent object en vervolgens een lijst met objecten en wijzigingen. We voeren een record uit van alle invoegingen, wijzigingen en verwijderingen naar de console. 

De eenvoudige functie uitbreiden

Deze voorbeeldfunctie is niet echt functioneel, maar om ons begrip van wat het mogelijk is om met functies te doen stollen, laten we de functie een beetje verder nemen en aanpassen. 

Omdat het een Node.js-toepassing is, kunnen we samenwerken met externe Node.js-bibliotheken. In dit geval gebruiken we een bibliotheek met de naam libphonenumber en wijzigen we onze functie om vermeldingen te ontleden als telefoonnummers, met de juiste opmaak en internationale prefix. 

Voordat u de onderstaande code invoert, installeert u de externe bibliotheek door het volgende in te voeren in de Realm Object Server:

npm install google-libphonenumber --save

druk op Hou op in de console om de functie te stoppen, en pas dan de functie aan met de volgende code:

var PNF = require ('google-libphonenumber'). PhoneNumberFormat; var phoneUtil = require ('google-libphonenumber'). PhoneNumberUtil.getInstance (); console.log ("startfunctie"); // voeg hier uw initialisatiecode toe module.exports = function (change_event) var realm = change_event.realm; var changes = change_event.changes.Reminder; var taskIndexes = changes.modifications; console.log ("Wijzig gedetecteerd:" + wijzigingen + "voor taakindexen", taskIndexes); // Haal de taakobjecten naar processen var reminders = realm.objects ("Reminder"); var herinnering = herinneringen [herinneringen.lengte - 1]; // Haal het taakobject op uit de realm met index console.log ("Nieuwe taak ontvangen:" + change_event.path); console.log ("Taakherinnering", herinnering); // haal date from wit.ai // gebruik waarschijnlijk deze 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 ("Geen telefoonnummer"); terug te keren;  console.log ("Telefoon geconverteerd naar", phoneUtil.format (phoneNumber, PNF.INTERNATIONAL)); realm.write (function () reminder.name = phoneUtil.format (phoneNumber, PNF.INTERNATIONAL);); ;

In de bovenstaande code maken we een verwijzingsbron voor de instantie naar de externe bibliotheek google-libphonenumber, en vervolgens via een lijst met de herinneringsobjecten realm.objects ( "Herinnering"). Vervolgens krijgen we een verwijzing naar de laatste herinnering in de array, omdat deze de meest recente is en vervolgens de gegevens converteren naar een telefoonnummer. 

We zullen het resultaat daarvan naar de console sturen, voordat we de geformatteerde versie van de gegevens daadwerkelijk naar het rijk schrijven, via:

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

Geef de functie opnieuw een draai door hem opnieuw te starten en voer in de iOS-simulator een telefoonnummer in dat niet correct is opgemaakt, zeg 17187998177. Via het consolelog en de uiteindelijke uitvoer van de app, moet het nummer correct worden opgemaakt met behulp van de externe bibliotheek, met de tussenruimte en het internationale toegangsnummer als volgt:

+1 718-799 8177

Wat we hier zien is een serverloze manier om een ​​gebeurtenis voor een wijziging (invoeging) te triggeren en de gegevens te formatteren voordat deze wordt voortgezet in de cloud.

Realtime URL-pad reguliere expressies opgeven

In onze dashboardfunctie wezen we eenvoudig op een specifieke Realm-toepassing, RealmDo, maar je kunt ook een reguliere expressie (regex) definiëren om meer uniek te onderscheiden welke paden de functie activeren. Om te matchen voor alle Realms, zou je gebruiken .* (die overeenkomt met nul of meer van een willekeurig teken). Of u kunt een door de gebruiker beheerd rijk koppelen aan ^ / ([0-9a-f] +) / $ herinnering.

Conclusie

Realm Functies creëren nieuwe mogelijkheden voor het Realm Mobile Platform door een eenvoudige en elegante manier aan te bieden om serverloze logica toe te voegen die in staat is om te reageren op veranderingen in Realms. Via het Dashboard kunnen ontwikkelaars functies maken die reageren op wijzigingen in alle realms of alleen op specifieke paden. 

In deze tutorial heb je een beetje geleerd over wat Realm Functions is, en hoe ze een holistische ontwikkelomgeving bieden, niet alleen voor het maken en aanhouden van data, maar ook voor het toevoegen van logica eraan. We hebben de standaardfunctie uitgebreid en een JavaScript-bibliotheek van derden genoemd om telefoonnummers te converteren. 

Hoewel ons voorbeeld een beetje gekunsteld is, biedt het u een idee van wat u kunt doen om Realm-objecten te beheren terwijl ze worden ingevoegd, gewijzigd of verwijderd. Dit is hetzelfde als hoe traditionele databases gebruikmaken van triggers, alleen serverloos en met minimale code, zoals u kunt zien. 

Kijk terwijl je hier bent eens naar enkele van onze andere iOS-ontwikkelingsposten op Envato Tuts+.