Serverless Logic With Realm Funksjoner

Hva du skal skape

I de foregående opplæringene tok vi en titt på Realm-plattformen, i tillegg til Realm-databasen på enheten for iOS. I det innlegget lærte du hvordan du synkroniserer appdataene dine lokalt og i skyen. Selv om dette presenterer en komplett løsning for mange utviklere, kan det hende du vil gjøre mer enn bare vedvarende data, men også kjøre server-side logikk. 

I år lagde Realm muligheten til å skape serverløs funksjonalitet via Realm Functions, slik at utviklere kan lage programlogikk for å svare på databasenes hendelser automatisk.

Realms serverløse databehandlingsløsning ligner Amazons AWS Lambda eller Microsofts Azure Functions. I likhet med dem, lar den deg kjøre kode uten å måtte avgjøre dine egne servere. Dine funksjoner vil kjøre på Realm Object Server. Realm-funksjoner gir sjansen til å skrive JavaScript-drevne funksjoner som reagerer på Realms levende objekter og administrerer dem gjennom Realm dashbord-grensesnittet. 

Enten du trenger å reagere på live-objekter og sende et trykkvarsel til brukere eller utløse et API-anrop til en annen tredjepartsleverandør SDK som Twilio, gir reaktive hendelser via funksjoner deg muligheten til å svare og reagere på serversiden. I denne opplæringen skal du lære å jobbe med Realm Functions.

Målet med denne opplæringen

I denne opplæringen lærer du hvordan du implementerer og jobber med Realm-funksjoner for å opprette en prøveutløsningsfunksjon som vil oppdatere en verdi i vår sky-database. Dette vil være et godt eksempel, men du kan bruke denne kunnskapen til mer praktiske problemer. 

I denne opplæringen vil vi dekke følgende:

  • hendelseshåndtering og funksjoner
  • grunner til å bruke funksjoner
  • skaper funksjoner fra dashbordet
  • integrere funksjoner i Realm Object Server.

Forutsatt kunnskap

Denne opplæringen antar at du har lest gjennom de to foregående opplæringsprogrammene i denne serien. Som Realm Funksjoner er skrevet i JavaScript, bør du også ha en grunnleggende forståelse av det språket, selv om du ikke trenger å være en ekspert. 

Hvis du vil ha en primer på Realm, sjekk ut de forrige innleggene i denne serien.

Hva er Realm funksjoner? 

I de foregående opplæringsprogrammene har du brukt Realm til å opprette enhets persistens, samt synkronisere brukerdata med skyen, men et bemerkelsesverdig fravær har vært i evnen til å jobbe intelligent med dataserver-side. Vi trenger noen ganger logikk på server-side som kan svare på endringer i dataene, på samme måte utløser arbeid i tradisjonelle databaser. 

Det er her Realm Functions kommer inn, som gir mulighet til å forutse og reagere på endringer i Realms. Realm Functions har også bemyndiget lag til å lage server-side logikk uten å ha behov for en dedikert backend-utvikler, som bygger på Realm-plattformen med minimal konfigurasjon, og uten å måtte bekymre seg om serialisering eller legge til flere endepunkter til serveren. 

Realm Functions er vårt "serverløse" applogikklag, hvor du enkelt kan bygge server-sidefunksjoner med enkel JavaScript, ingen backend-team nødvendig. Når synkroniserte data endres, utføres den tilpassede logikken, noe som gjør det raskt og enkelt for mobilutviklere å bygge og sende sofistikerte serveravhengige funksjoner. - Realm.io

Hendelsehåndtering i Realm

Funksjoner håndterer hendelser gjennom Realm Object Server med Node.js funksjoner som senere kalles av Realm Object Server Global Lyttings API, som passerer changee () objekter utløst via funksjonslogikken. Dette oppnås via server-side Node.js-forekomsten, som kobles til API for global hendelselytter, slik at utviklere kan observere for endringer over Realms og filtrere for bestemte Rikker som samsvarer med et bestemt Regex-mønster. 

Utviklere kan derfor lytte til bestemte og unike Realm-baner som kan settes opp for bestemte brukere, og deretter reagere på brukerens endringer. Den globale hendelseslytteren utløser deretter et varsel for server-sidefunksjonene for å svare på endringene. 

Meldingspakken informerer hendelseshandlerne om den virtuelle banen til den oppdaterte rike, så vel som Realm-objektet eller objektene som er endret. Disse er oppdelt etter klassenavn og objektindekser endret under den siste synkroniseringstransaksjonen. 

Opprettelse av en Rike Event Handling-funksjon innebærer å opprette et lite Node.js-program, med a package.json å definere søknaden og dens avhengigheter. Hvis du vil ha mer informasjon om hvordan du lager hendelsesbehandlere i Realm Object Server, kan du se Retningslinjer for Retningslinjer for Hendelsehåndtering. 

Deretter begynner vi å sette opp vår første Realm-funksjon. 

Sette opp din første realm-funksjon

I denne veiledningen skal vi fokusere på en enkel funksjon som eksempel for å illustrere hvordan funksjoner blir opprettet og integrert i Realm Mobile Platform. Det antas at du allerede har den eksisterende applikasjonen fra tidligere opplæringsprogrammer, som er vert på Realm Object Server og kjører, før du fortsetter med resten av denne opplæringen. 

Først skal du gå til Realm Object Server-dashbordet og velge funksjoner fane. På denne siden gir Realm deg en prøvefunksjon som du kan aktivere og kjøre raskt, ved å først navngi funksjonen, velge hvilken Realm å bruke den til (vår arbeidsapplikasjon i dette tilfellet, RealmDoApp), og deretter starte funksjonen lytter ved å trykke på Start knapp. 

Gå videre og gjør det, mens du kjører iOS-appen din i Xcode Simulator, og opprett en ny påminnelsesoppgave. Du vil legge merke til at loggen under er fylt med loggmeldinger for de forskjellige tilstandene i appen din.

La oss se nærmere på prøvekoden: 

console.log ("Startfunksjon"); // legg til initialiseringskoden her modul.exports = funksjon (changeEvent) // hendelseshandler kode går her console.log ("Endringer i rike på:", changeEvent.path); var realm = changeEvent.realm; for (var klassenavn i changeEvent.changes) var changes = changeEvent.changes [className]; var objekter = realm.objects (klassenavn); console.log ("Endringer i modell:", klassenavn); for (la pos of changes.insertions) console.log ("- objekt satt på posisjon", pos, ":", objekter [pos]);  for (la pos of changes.modifications) console.log ("- objekt endret på posisjon", pos, ":", objekter [pos]);  for (la pos of changes.deletions) console.log ("- objekt slettet på posisjon", pos);  console.log (""); ;

Funksjonen starter ved å eksponere hendelsesleveringsmetoden gjennom eksport. Hendelsehåndteringsfunksjoner ta en changee som deres parameter. Denne enkle funksjonen utsender bare changeEvent.path til konsollen, og viser hva som forandres nøyaktig. 

Vi får da en referanse til det endrede riket gjennom changee objekt, og få en liste over objekter og endringer. Vi lager en oversikt over alle innsettingene, endringene og slettingene til konsollen. 

Utvide den enkle funksjonen

Denne prøvefunksjonen er ikke veldig funksjonell, men for å styrke vår forståelse av hva det er mulig å gjøre med funksjoner, la oss ta funksjonen litt videre og tilpasse den. 

Siden det er en Node.js-applikasjon, kan vi jobbe med tredjeparts Node.js-biblioteker. I dette tilfellet bruker vi et bibliotek som heter libanonummer og endrer vår funksjon for å analysere oppføringer som telefonnumre, med riktig formatering og internasjonalt prefiks. 

Før du legger inn koden nedenfor, installerer du tredjepartsbiblioteket ved å skrive inn følgende i Realm Object Server:

npm installer google-libonenummer - lagre

trykk Stoppe i konsollen for å stoppe funksjonen som kjører, og deretter endre funksjonen med følgende kode:

var PNF = krever ('google-libanonummer'). PhoneNumberFormat; var phoneUtil = krever ('google-libphone nummer'). TelefonNumberUtil.getInstance (); console.log ("Startfunksjon"); // legg til initialiseringskoden her modul.exports = funksjon (change_event) var realm = change_event.realm; var endringer = change_event.changes.Reminder; var taskIndexes = changes.modifications; console.log ("Endre oppdaget:" + endringer + "for taskindexes", taskIndexes); // Få oppgaveobjektene til prosesser var påminnelser = realm.objects ("Påminnelse"); var påminnelse = påminnelser [påminnelser.lengde - 1]; // Hent oppgaveobjektet fra Realm med index console.log ("Ny oppgave mottatt:" + change_event.path); console.log ("Oppgavepåminnelse", påminnelse); // hente dato fra wit.ai // sannsynligvis bruk denne 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'); hvis (! telefonnummer) console.log ("Ikke et telefonnummer"); komme tilbake;  console.log ("Telefon konvertert til", phoneUtil.format (telefonnummer, PNF.INTERNATIONAL)); realm.write (funksjon () reminder.name = phoneUtil.format (telefonnummer, PNF.INTERNATIONAL);); ;

I den ovennevnte koden oppretter vi en forekomstreferanse til tredjepartsbiblioteket google-libphonenumber, og så får du en liste over påminnelsesobjektene via realm.objects ( "Påminnelse"). Deretter får vi en referanse til den siste påminnelsen i arrayet, som den er den nyeste, og konverterer deretter dataene til et telefonnummer. 

Vi sender resultatet av det til konsollen, før du faktisk skriver den formaterte versjonen av dataene tilbake til verden, via:

realm.write (funksjon () reminder.name = phoneUtil.format (telefonnummer, PNF.INTERNATIONAL);); ;

Gi funksjonen en annen spinn ved å starte den på nytt, og i iOS-simulatoren, skriv inn et telefonnummer som ikke er formatert ganske riktig, si 17187998177. Gjennom konsollloggen og den endelige utgaven på appen, bør den formatere tallet riktig ved hjelp av tredjepartsbiblioteket, med mellomrom og internasjonalt prefiks som følger:

+1 718-799 8177

Det vi ser her er en serverløs måte å utløse et arrangement for en endring på (innføring) og formatering av dataene før du fortsetter den til skyen.

Angi regelmessige uttrykk for Realm URL-banen

I vår dashbord-funksjon pekte vi rett og slett på et bestemt Realm-program, RealmDo, men du kan også definere et regulært uttrykk (regex) for å mer unikt skille hvilke veier som utløser funksjonen. For å matche for alle Realms, ville du bruke .* (som matcher null eller mer av et hvilket som helst tegn). Eller du kan matche en bruker-eid Realm med ^ / ([0-9a-f] +) / Påminnelse $.

Konklusjon

Realm-funksjoner skaper nye muligheter for Realm Mobile Platform ved å gi en enkel og elegant måte å legge til serverløs logikk som er i stand til å reagere på endringer i Realms. Gjennom oversikten kan utviklere lage funksjoner som svarer på endringer i alle Realms, eller bare på bestemte baner. 

I denne opplæringen lærte du litt om hva Realm-funksjoner er, og hvordan de gir et helhetlig utviklingsmiljø, ikke bare for å skape og vedvare data, men også for å legge til logikk for det. Vi utvidet standardfunksjonen og kalt et tredjeparts JavaScript-bibliotek for å konvertere telefonnumre. 

Mens vårt eksempel er litt opptatt, gir det deg en ide om hva du kan gjøre for å administrere Realm-objekter ettersom de er satt inn, endret eller slettet. Dette er akkurat som hvordan tradisjonelle databaser utnytter triggere, bare server-mindre og med minimal kode, som du kan se. 

Mens du er her, ta en titt på noen av våre andre iOS-utviklingsposter her på Envato Tuts+.