Serverless Logic With Realm Funktioner

Vad du ska skapa

I de tidigare handledningarna tittade vi på Realm-plattformen och på RealM-databasen på enheten för iOS. I det inlägget lärde du dig att synkronisera dina appdata lokalt såväl som i molnet. Även om detta presenterar en komplett lösning för många utvecklare, kanske du vill göra mer än bara kvarstår data, men även köra serverns logik. 

I år har Realm lagt till möjligheten att skapa serverlös funktionalitet via Realm Functions, vilket gör det möjligt för utvecklare att skapa programlogik för att svara på databasevenemang automatiskt.

Realms serverlösa datorlösning är lik Amazonas AWS Lambda eller Microsofts Azure Functions. Liksom dem tillåter du att köra kod utan att behöva tillhandahålla egna servrar. Dina funktioner kommer att köras på Realm Object Server. Realm-funktioner ger chansen att skriva JavaScript-drivna funktioner som reagerar på Realms liveobjekt och hanterar dem via gränssnittet Realm Dashboard. 

Oavsett om du behöver reagera på liveobjekt och skicka en push-meddelande till användare eller utlösa ett API-samtal till en annan tredjepartsleverantörs SDK som Twilio, kan reaktiva händelser via funktioner låta dig reagera och reagera på serversidan. I denna handledning kommer du att lära dig hur du arbetar med Realm-funktioner.

Målen för denna handledning

I den här handledningen lär du dig att implementera och arbeta med Realm-funktioner för att skapa en samplingsutlösare som uppdaterar ett värde i vår molndatabas. Detta kommer att vara ett konstruerat exempel, men du kan tillämpa denna kunskap på mer praktiska problem. 

I denna handledning kommer vi att täcka följande:

  • händelsehantering och funktioner
  • anledningar att använda funktioner
  • skapa funktioner från instrumentpanelen
  • integrera funktioner i din Realm Object Server.

Förutsatt kunskap

Denna handledning förutsätter att du har läst igenom de tidigare två handledningarna i denna serie. Eftersom Realm-funktioner skrivs i JavaScript bör du också ha en grundläggande förståelse för det språket, även om du inte behöver vara expert. 

Om du vill ha en primer på Realm, kolla in de tidigare inläggen i denna serie.

Vad är Realm Funktioner? 

I de tidigare handledningarna har du använt Realm för att skapa persistens på enheten, samt att synkronisera användardata med molnet, men en anmärkningsvärd frånvaro har kunnat fungera intelligent med dataserversidan. Vi behöver ibland serverns logik som kan svara på ändringar i data, på samma sätt utlöser arbete i traditionella databaser. 

Det här är där Realm Functions kommer in, vilket ger möjlighet att förutse och reagera på förändringar i Realms. Realm Functions gav också lag till att skapa serverns logik utan att behöva ha en dedikerad back-end-utvecklare, som bygger på Realm-plattformen med minimal konfiguration och utan att behöva oroa sig för serialisering eller lägga till ytterligare slutpunkter på servern. 

Realm-funktioner är vårt "serverlösa" applogiklager, där du enkelt kan bygga serverfunktioner med enkelt JavaScript, inget backend-team krävs. När synkroniserade data ändras, exekverar din anpassade logik, vilket gör det snabbt och enkelt för mobila utvecklare att bygga och leverera sofistikerade serverberoende funktioner. - Realm.io

Händelsehantering i Realm

Funktioner hanterar händelser via Realm Object Server med Node.js-funktioner som senare kallas av Realm Object Server globalt lyssnings API, som passerar changeEvent () objekt som utlöses via funktionslogiken. Detta uppnås via server-sidan Node.js-förekomsten, som ansluter till API: s globala händelseläserare, så att utvecklare kan observera för förändringar över Realms och filtrering för specifika Realms som matchar ett specifikt Regex-mönster. 

Utvecklare kan därför lyssna på specifika och unika Realm-banor som kan ställas in för specifika användare och sedan reagera på användarens ändringar. Den globala händelseläsenaren utlöser sedan en anmälan för serverns funktioner för att svara på ändringarna. 

Meddelandepaketet informerar händelsehanterarna om den virtuella vägen för det uppdaterade Riket, liksom Realm-objektet eller objekten som har ändrats. Dessa är uppdelade på klassnamn och objektindex som har ändrats under den senaste synkroniseringstransaktionen. 

Att skapa en Realm Event Handling-funktion innebär att skapa en liten Node.js-applikation med en package.json för att definiera ansökan och dess beroenden. Mer information om hur man skapar händelsehanterare i Realm Object Server finns i Riktlinjer för hantering av händelsehantering. 

Därefter börjar vi ställa in vår första Realm-funktion. 

Ställa in din första realm-funktionen

I denna handledning ska vi fokusera på ett enkelt funktionsexempel för att illustrera hur funktioner skapas och integreras i Realm Mobile Platform. Det antas att du redan har den befintliga applikationen från tidigare tutorials, värd på din Realm Object Server och kör, innan du fortsätter med resten av denna handledning. 

Gå först till Realm Object Server-instrumentpanelen och välj funktioner flik. På den här sidan ger Realm dig en exempelfunktion som du kan aktivera och köra snabbt, genom att först ange funktionen, välja vilken Realm som ska applicera den till (vår arbetsapplikation i detta fall, RealmDoApp) och sedan starta funktionshändelsen lyssnare genom att trycka på Start knapp. 

Fortsätt och gör det medan du kör din iOS-app i Xcode Simulator och skapa en ny påminnelseuppgift. Du kommer att märka att loggen nedan fyller i loggmeddelanden för de olika tillstånden i din app.

Låt oss ta en titt på provkoden i större detalj: 

console.log ("Startfunktion"); // lägg till din initialiseringskod här module.exports = function (changeEvent) // händelsehanterarkoden går här console.log ("Ändringar i rike på:", changeEvent.path); var realm = changeEvent.realm; för (var klassnamn i changeEvent.changes) var changes = changeEvent.changes [className]; var objekt = realm.objects (klassnamn); console.log ("Ändringar i modell:", klassnamn); för (låt pos of changes.insertions) console.log ("- objekt infogat i position", pos, ":", objekt [pos]);  för (låt pos of changes.modifications) console.log ("- objekt modifierat vid position", pos, ":", objekt [pos]);  för (låt pos of changes.deletions) console.log ("- objekt raderat vid position", pos);  console.log (""); ;

Funktionen startar genom att exponera händelsehanteringsmetoden genom export. Händelsehanteringsfunktioner ta en changeEvent som deras parameter. Denna enkla funktion matar bara ut changeEvent.path till konsolen och visar vad som ändras exakt. 

Vi får då en hänvisning till det ändrade riket genom changeEvent objekt och sedan få en lista över objekt och ändringar. Vi skriver ut en lista över alla infogningar, modifieringar och raderingar till konsolen. 

Utöka den enkla funktionen

Denna provfunktion är inte riktigt funktionell, men för att stärka vår förståelse av vad det är möjligt att göra med funktioner, låt oss ta funktionen lite längre och anpassa den. 

Eftersom det är en Node.js-applikation kan vi arbeta med tredjeparts Node.js-bibliotek. I det här fallet använder vi ett bibliotek som heter libphone nummer och ändrar vår funktion för att analysera poster som telefonnummer, med rätt formatering och internationellt prefix. 

Innan du anger koden nedan ska du installera biblioteket från tredje part genom att ange följande i Realm Object Server:

npm installera google-libphone nummer - spara

Tryck Sluta i konsolen för att stoppa funktionen och sedan ändra funktionen med följande kod:

var PNF = kräver ("google-libphone nummer"). PhoneNumberFormat; var phoneUtil = kräver ('google-libphone nummer'). PhoneNumberUtil.getInstance (); console.log ("Startfunktion"); // lägg till din initialiseringskod här module.exports = function (change_event) var realm = change_event.realm; var changes = change_event.changes.Reminder; var taskIndexes = changes.modifications; console.log ("Ändra detekterade:" + ändringar + "för taskindexes", taskIndexes); // Hämta uppgiftsobjekten till processer var påminnelser = realm.objects ("Påminnelse"); varpåminnelse = påminnelser [påminnelser.längd - 1]; // Hämta uppgiftsobjektet från Realm med index console.log ("Ny uppgift mottagen:" + change_event.path); console.log ("Task Reminder", påminnelse); // få datum från wit.ai // bruka använda det här https://wit.ai/docs/http/20160526#get--message-link // nod-wit: https://github.com/wit-ai / node-wit var phoneNumber = phoneUtil.parse (reminder.name, 'US'); om (! phoneNumber) console.log ("Inte ett telefonnummer"); lämna tillbaka;  console.log ("Telefon konverterad till", phoneUtil.format (phoneNumber, PNF.INTERNATIONAL)); realm.write (function () reminder.name = phoneUtil.format (phoneNumber, PNF.INTERNATIONAL);); ;

I ovanstående kod skapar vi en instansreferens till biblioteket från tredje part google-libphonenumber, och sedan få en lista med påminnelsobjekt via realm.objects ( "påminnelse"). Då får vi en referens till den sista påminnelsen i arrayen, som den är den senaste, och konverterar sedan dess data till ett telefonnummer. 

Vi skickar resultatet av det till konsolen innan du faktiskt skriver den formaterade versionen av data tillbaka till realm via:

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

Ge funktionen en annan snurrning genom att starta om den, och i iOS-simulatorn, skriv ett telefonnummer som inte formateras rätt korrekt, säg 17187998177. Genom konsolloggen och den slutliga utgåvan på appen ska den formatera numret korrekt med hjälp av biblioteket från tredje part, med avståndet och det internationella prefixet enligt följande:

+1 718-799 8177

Det vi ser här är ett serverlöst sätt att utlösa en händelse för en ändring (infogning) och formatering av data innan den fortsätter till molnet.

Specificera webbadresser för realtidsadresser i realtid

I vår dashboardfunktion pekade vi bara på en specifik Realm-applikation, RealmDo, men du kan också definiera ett reguljärt uttryck (regex) för att mer unikt skilja vilka vägar som utlöser funktionen. För att matcha för alla Realms, skulle du använda .* (som matchar noll eller mer av något tecken). Eller du kan matcha en användarägd Realm med ^ / ([0-9a-f] ^) / påminnelse $.

Slutsats

Realm-funktioner skapar nya möjligheter för Realm Mobile Platform genom att erbjuda ett enkelt och elegant sätt att lägga till serverlös logik som kan reagera på förändringar i Realms. Genom Dashboard kan utvecklare skapa funktioner som svarar på förändringar över alla Realms, eller bara på specifika vägar. 

I den här handledningen lärde du dig lite om vilka Realm-funktioner som är och hur de tillhandahåller en holistisk utvecklingsmiljö, inte bara för att skapa och beställa data utan också för att lägga till logik till den. Vi förlängde standardfunktionen och kallade ett JavaScript-bibliotek från tredje part för att konvertera telefonnummer. 

Medan vårt exempel är lite konstruerat, ger det dig en uppfattning om vad du kan göra för att hantera Realm-objekt när de infogas, ändras eller raderas. Det här är precis som traditionella databaser som utnyttjar triggers, bara serverlösa och med minimal kod, som du kan se. 

Medan du är här, ta en titt på några av våra andra iOS-utvecklingsposter här på Envato Tuts+.