Advanced Guides
Parse Server 3.1: Migration und Neuerungen für Entwickler
24 min
mehr power für ihre app mit parse server 3 1 einführung die parse community hat kürzlich version 3 1 des parse servers https //docs parseplatform org/parse server/guide/ dieses update hat die syntax des cloud codes bereinigt sie ist viel besser geeignet, um die es6 async und await konstrukte zu nutzen darüber hinaus wurden einige eigenheiten, die mit der verwendung von parse verbunden sind, abgeschafft, zum beispiel geben cloud funktionen einfach ein promise zurück, anstatt die fehler fehler oder erfolg erfolg nachrichten im response objekt zu verwenden sie können ihre apps auf back4app ganz einfach über ihr dashboard aktualisieren dieser leitfaden zeigt, wie sie ihren code aktualisieren, um die neuen funktionen von 3 1 zu nutzen um diesem leitfaden zu folgen, sind sie herzlich eingeladen, sich das beispielprojekt anzusehen dies ist ein gast tutorial, das von john considine https //github com/considine , leitendem entwickler bei k optional https //koptional com/ ziele um ihren back4app parse server auf 3 1 zu aktualisieren und ihren cloud code entsprechend zu migrieren voraussetzungen um dieses tutorial abzuschließen, benötigen sie ° eine bestehende back4app anwendung, die parse server 2 x verwendet ° folgen sie dem tutorial zum erstellen einer neuen app um zu lernen, wie man eine app bei back4app erstellt zusammenfassung der änderungen die bemerkenswertesten änderungen sind die folgenden 1\ cloud code läuft mit parse sdk 2 x zuvor lief cloud code mit parse sdk 1 x mit parse server 3 1 läuft es mit parse sdk 2 x schau dir parse sdk versionen an, um besser zu verstehen, was das bedeutet dieser große versionssprung beinhaltet hauptsächlich fehlerbehebungen er fügt auch containedby und includeall abfragemethoden hinzu, sowie die möglichkeit, ein objekt mit includes abzurufen 2 aggregataktualisierung seit parse 2 7 1 kannst du die aggregat methode in einer abfrage verwenden dies ermöglicht es dir, die zugrunde liegende datenbank ein wenig mehr zu nutzen jetzt wurde die syntax für die aggregat methode auf parse query parse query aktualisiert du kannst eine abfrage in zwei phasen ausführen die übereinstimmung übereinstimmung und die gruppe gruppe phase früher benötigten sie den pipeline schlüssel im pipeline objekt nicht aufgrund der zugrunde liegenden api müssen sie jetzt den pipeline schlüssel ausdrücklich einfügen der wert sollte ein array aus ein oder zwei stufen sein, das group group und match match enthält schauen sie sich parse offizielle dokumentation für spezifischere beispiele an 3 optimierungen im hintergrund es wurden einige optimierungen im hintergrund vorgenommen zum beispiel wird ein parse livequery die klassenebene berechtigungen (clps) zusammen mit daten abrufen, um doppelten datenbankzugriff zu verhindern 4\ parse zurücksetzen e mail wenn sie eine e mail zur zurücksetzung des passworts anfordern, gibt der server erfolg zurück, auch wenn diese e mail nicht gespeichert ist darüber hinaus laufen die token zur zurücksetzung des passworts ab, wenn die e mail eines benutzers zurückgesetzt wird 5\ aktualisierung der cloud trigger mit diesem release können sie daten zwischen den beforesave und aftersave triggern auf demselben objekt teilen zum beispiel 1 parse cloud beforesave('comment', async request => { 2 request context = { 3 foo 'bar' 4 }; 5 }); 6 7 parse cloud aftersave('comment', async request => { 8 console log(request context foo); //bar 9 }); sie können mehr über die änderungen am parse server im offiziellen parse 3 1 changelog erfahren, indem sie auf hier klicken 6\ verbesserung der livequery der parse livequery client ermöglicht es ihnen, sich für abfragen anzumelden und updates vom server zu erhalten, sobald sie eintreffen traditionelle abfragen werden einmal vom client ausgeführt, daher ist dies sehr hilfreich für fälle wie messaging usw mit back4app können sie auch von dieser technologie profitieren https //www back4app com/docs/platform/parse server live query example mit der veröffentlichung von 3 x hat die parse community das system für livequery acls https //docs parseplatform org/js/guide/#security for other objects verbessert sie können jetzt ein sitzungstoken an die subscribe methode einer live abfrage übergeben, und der parse server verwaltet nur die rückgabe von ergebnissen, auf die dieser benutzer zugriff hat zum beispiel kann ein benutzer lese /schreibzugriff auf bestimmte ‚nachrichten‘ haben, aber nicht auf alle 1 let query = new parse query('message'); 2 // you can get session token with 3 // parse user current() getsessiontoken() when logged in 4 let subscription = client subscribe(query, sessiontoken); der obige code wird automatisch alle nachrichten abonnieren, auf die der benutzer zugriff hat, und befreit sie von der verantwortung, spezifische nachrichten abzufragen der hauptteil der änderungen betrifft, wie cloud code behandelt wird dazu siehe den migrationsleitfaden unten 1 technische grundlagen ausrichten wir beginnen mit einem beispiel cloud projekt, das die version 2 x verwendet so können wir durch die entsprechenden änderungen der syntax navigieren sie können das repository für dieses beispielprojekt sehen wenn sie mit async und await vertraut sind, können sie diesen abschnitt überspringen die entwicklung von asynchronem code in javascript sieht ungefähr so aus callback funktionen promises async / await jede moderne javascript anwendung wird wahrscheinlich alle drei verwenden callback funktionen beinhalten das übergeben einer funktion als argument an eine andere funktion diese zweite funktion kann die erste zu einem bestimmten zeitpunkt ausführen 1 // callbacks 2 // executes callback function after waiting 100 milliseconds 3 settimeout(function() { 4 alert('my callback function'); 5 }, 100); rückrufe sind unerlässlich, können aber unhandlich werden, wenn es darum geht, viele von ihnen zu verketten insbesondere kann das verschachteln mehrerer ebenen schwer zu lesen sein, und die fehlerbehandlung erweist sich als schwierig daher wurde in es2015 das promise eingeführt 1 // promises 2 // executes several promises in a row with no significant nesting 3 const mypromise = new promise(function(resolve, reject) { 4 settimeout(function() { 5 if (math random() < 0 2) reject(new error('random failure!')); 6 resolve('finished'); 7 }, 100); 8 }); 9 10 // executes this promise 4 times and catches errors involved 11 mypromise 12 then(() => mypromise) 13 then(() => mypromise) 14 then(() => mypromise) 15 then(() => mypromise) 16 catch(e => console log(e)); versprechen verbessern die lesbarkeit der asynchronen programmierung sie machen auch pipelines expliziter aber noch größere fortschritte wurden in es2017 mit den async / await konstrukten gemacht ihr code kann jetzt auf die ergebnisse eines versprechens warten, ohne sich auf die then / catch blöcke zu verlassen (die auch schwer zu lesen werden können) 1 // using the definition of mypromise from the above code 2 async function foo() { 3 try { 4 let result = await mypromise; 5 result = await mypromise; 6 result = await mypromise; 7 } catch (e) { 8 console log(e); 9 } 10 } vielleicht mag dies für ein sehr einfaches beispiel nicht eleganter erscheinen als einfache versprechen aber auf die ergebnisse einer asynchronen funktion zu warten, ist oft genau das, was wir tun möchten daher optimiert es wirklich die lesbarkeit unseres codes unterstützung für async/await wie bereits erwähnt, wurde async/await in die ecmascript 2017 spezifikation (es8) aufgenommen bei servercode ist versionierung kaum ein problem, da sie auf die version von node js, die diese funktionen unterstützt , aktualisieren können seien sie versichert, dass die umgebung von back4app aktuelle stabile versionen unterstützt bei browsercode werden transpiler wie babel einen es2016 kompatiblen code erzeugen, der async / await verwendet und in modernen browsern funktioniert 2 denken sie anders über ihren code nach die hauptänderung bei cloud code betrifft, was der entwickler tut, im vergleich dazu, was die bibliothek tut zuvor mussten sie die antwort explizit verwalten da der großteil des cloud codes asynchron ausgeführt wird datenbankabfragen und schreibvorgänge durchführt ist es sinnvoller, ein promise zurückzugeben, um den boilerplate code zu reduzieren die intuition hinter cloud funktionen ist, dass es minimalen aufwand und konfiguration beim schreiben von serverseitigem code gibt diese veröffentlichung verkörpert diese idee; behalten sie dies im hinterkopf, während sie refaktorisieren und neue funktionen erstellen um zu zeigen, wie cloud code funktionen in parse server 3 1 funktionieren, haben wir ein funktionales cloud code beispiel aus einer version von parse server vor der migration neu geschrieben sie können diesen code finden, indem sie hier die gleiche cloud code funktion ist in parse 3 1 wie unten gezeigt geschrieben 1 // cloud code before migration 2 // full code found in link above 3 const post = 'post'; 4 parse cloud define('posts\ get', function(request, response) { 5 // needs a post id 6 return new parse query(post) 7 get(request params id, { usemasterkey true }) 8 then(post => { 9 response success(post); 10 }) 11 catch(e => { 12 response error({ message e message }); 13 }); 14 }); 3 alle asynchronen marker hinzufügen jede funktion, die await verwendet, muss mit dem async modifikator deklariert werden diese einfache umstrukturierung wird async an alle cloud funktionen anhängen sie wird sie auch durch pfeilfunktionen ersetzen, da sie in diesem fall prägnanter sind (und was der aktualisierte offizielle parse leitfaden verwendet) 1 // snippet of step 2 code refactoring see full code 2 // here in the link at the top of this step 3 const post = 'post'; 4 const comment = 'comment'; 5 6 parse cloud define('posts\ get', async (request) => { 7 // needs a post id 8 return new parse query(post) 9 get(request params id, { usemasterkey true }); 10 } ihr code wird nach dieser umstrukturierung wie dies aussehen bisher nichts verrücktes im nächsten schritt werden wir für diese änderung unser geld wert sein 4 entfernen von verweisen auf die antwort, await verwenden ihr code wird nach dieser umstrukturierung wie dies aussehen dieser schritt ist ein wenig kniffliger wir müssen alle verweise auf die variable ‚response‘ entfernen und stattdessen ein versprechen zurückgeben im falle mehrerer abfrage /speicherfunktionen auf die antwort warten schauen sie sich die methode zum erstellen von kommentaren an, um zu sehen, wie dies gemacht wird 1 // snippet of step 3 code refactoring see full code 2 // here in the link at the top of this step 3 parse cloud define('comment\ create', async request => { 4 // post should have text and should have a user and a post id 5 if (!request user) { 6 throw new error('unauthenticated!'); 7 } 8 9 if (!request params text) { 10 throw new error('a comment needs text!'); 11 } 12 if (!request params post id) { 13 throw new error('a comment needs a post!'); 14 } 15 16 // get the post 17 18 const post = await new parse query(post) get(request params post id, { 19 usemasterkey true 20 }); 21 return new parse object(comment, { 22 text request params text, 23 user request user, 24 post post 25 }) save(null, { usemasterkey true }); 26 }); beachten sie, dass jetzt wird ein javascript fehler ausgelöst, anstatt response error aufzurufen parse wird dies für uns in eine antwort umwandeln das löschen eines ‚beitrags‘ oder ‚kommentars‘ erfordert zunächst das abrufen des objekts und dann dessen zerstörung durch die verwendung von ‚await‘ kann die zerstörungsmethode auf das gespeicherte objekt außerhalb eines blocks zugreifen das vervollständigt alle notwendigen refaktorisierungen für die migration das heißt, wenn sie bis zu diesem schritt kommen, herzlichen glückwunsch! ihr code wird auf back4app parse 3 1 laufen! 5 fortgeschrittene tricks (optional) die folgenden änderungen sind optional, können jedoch ihren code erheblich verkürzen ich finde, sie reduzieren boilerplate sie haben wahrscheinlich viele manuelle überprüfungen für parameter oder den authentifizierten benutzer bemerkt diese stellen sicher, dass kein seltsames verhalten auftritt zum beispiel haben wir entschieden, dass unser ‚post‘ objekt text benötigt, also wird das objekt ohne den ‚text‘ parameter gespeichert, wenn keiner übergeben wird eine möglichkeit, dies zu verhindern, besteht darin, zu überprüfen, ob text übergeben wurde aber manuelle überprüfungen können zeitaufwendig und unelegant sein in diesem abschnitt nutzen wir objektzerlegung um diese überprüfungen implizit abzuschließen sie sollten die dokumentation oben sehen, wenn sie nicht wissen, was zerteilung ist aber kurz gesagt, es ermöglicht ihnen, eine eigenschaft eines objekts in eine variable mit sehr prägnanter syntax umzuwandeln 1 // this 2 var obj = { 3 hi true, 4 bye false 5 }; 6 var hi = obj hi; 7 var bye = obj bye; 8 9 // is equivalent to this 10 var obj = { 11 hi true, 12 bye false 13 }; 14 var { hi, bye } = obj; 15 16 console log(hi); 17 // true 18 console log(bye); 19 // false destructuring ist weniger ausführlich als manuelle zuweisung es ermöglicht auch, parameter variablen spontan zu deklarieren, was schön ist 1 parse cloud define('posts\ get', async ({ params { id } }) => { 2 // id is declared 3 }); wenn wir es mit einer es2015 notation für objektinitialisierung kombinieren, können wir unsere parameterüberprüfungen optimieren wir können dies tun 1 // iterates through object's keys makes sure, for each key, the value is set 2 const assertparams = parameter obj => { 3 for (var key of object keys(parameter obj)) { 4 if (typeof parameter obj\[key] === 'undefined') 5 throw new error(`missing parameter ${key}`); 6 } 7 }; 8 9 var obj = { 10 hi true, 11 bye false 12 }; 13 var { hi, undef, bye } = obj; // undef will be undefined 14 var check 1 = { hi, bye }; 15 var check 2 = { hi, undef }; 16 17 // check = { hi true, no undefined } 18 assertparams(check 1); // passes 19 assertparams(check 2); // throws error für unseren parse code können wir folgendes tun 1 // snippet of advanced code refactoring see full code 2 // here in the link at the top of this step 3 parse cloud define('posts\ delete', async ({ user, params { id } }) => { 4 // makes sure user is authenticated, and id parameter is passed 5 assertparams({ user, id }); 6 const post = await new parse query(post) get(id, { 7 usemasterkey true 8 }); 9 return post destroy({ usemasterkey true }); 10 }); wenn das einschüchternd ist, keine sorge der vollständige code beispiel könnte helfen kurz gesagt, ‚assertparams‘ ist eine hilfsfunktion, die einen fehler auslöst, wenn ein wert undefiniert ist wir können parameter in einem schritt überprüfen, indem wir objektzerlegung und die objektinitialisierung von es2015 kombinieren dies entfernt acht oder neun manuelle überprüfungen, die nach einer weile unansehnlich werden 6 upgrade auf back4app sobald sie ihren code migriert haben, müssen sie noch zwei weitere dinge tun, um ihn auf back4app zum laufen zu bringen aktualisieren sie ihre back4app serverversion laden sie ihren neuen cloud code hoch ich habe den ersten schritt bereits kurz erwähnt alles, was sie tun müssen, ist, sich bei back4app anzumelden und zum dashboard ihrer app zu gehen wählen sie von dort aus einfach „servereinstellungen“ auf der linken seite und dann die schaltfläche „einstellungen“ auf der karte „parse server verwalten“ sie können dann die radiobutton option für den parse server 3 1 1 auswählen und auf „speichern“ klicken last but not least können sie ihren code über die back4app cli https //blog back4app com/2017/01/20/cli parse server/ , oder ihr dashboard mit dem manuellen upload hochladen siehe diese anleitung https //www back4app com/docs/android/parse cloud code wenn sie weitere informationen zu diesem schritt benötigen hinweise zum starten einer neuen version wenn ihr code komplex ist, kann es eine gute idee sein, einige tests durchzuführen, bevor sie diese beiden schritte ausführen back4app hat einige anleitungen, wie sie dies hier und hier durchführen können schließlich ist es wichtig zu beachten, dass diese änderungen breaking der code, den wir auf einem 2 x parse server geschrieben haben, wird fehlschlagen, und die verwendung von 2 x code auf einem 3 1 server wird ebenfalls fehlschlagen daher müssen sie sicherstellen, dass sie ihre back4app parse version sofort aktualisieren, wenn sie ihren aktualisierten cloud code hochladen wenn sie viele benutzer haben und sich sorgen machen, dass der code upload und das versions upgrade leicht asynchron sind, können sie etwas wie dies tun 1 const serverversion = 2 parse coremanager get('version') === 'js1 11 1' ? 'old' 'new'; 3 4 if (serverversion === 'new') { 5 parse cloud define('posts\ get', async ({ params { id } }) => { 6 assertparams({ id }); 7 // needs a post id 8 return new parse query(post) get(id, { 9 usemasterkey true 10 }); 11 }); 12 } else if (serverversion === 'old') { 13 // old definition here 14 } dieser code ermittelt dynamisch die version und definiert cloud funktionen basierend darauf nach dem hochladen würden sie auf 3 1 wechseln und dann könnten sie den code mit dem entfernten alten teil erneut hochladen die anfängliche überprüfung stellt sicher, dass es keinen punkt gibt, an dem ihr code abstürzt da sie innerhalb von ein paar sekunden upgraden und hochladen können, ist es normalerweise nicht notwendig fazit in diesem leitfaden haben wir einfach demonstriert, wie sie ihren cloud code auf die parse 3 1 version migrieren denken sie daran, ihre back4app version auf 3 1 zu erhöhen, nachdem sie diese änderungen vorgenommen haben ebenso wichtig ist, dass dieser leitfaden eine verbesserte syntax demonstriert, die parse 3 1 nutzt unsere refaktorisierungen haben den code von 160 zeilen auf 90 zeilen reduziert und ihn viel lesbarer gemacht für tatsächliche anwendungen wird sich dies auszahlen