Advanced Guides
Aggiornamento Parse 3.1: Migrazione Cloud Code
24 min
maggiore potenza alla tua app con parse server 3 1 introduzione la comunità di parse ha recentemente rilasciato la versione https //docs parseplatform org/parse server/guide/ questo aggiornamento ha semplificato la sintassi del cloud code è molto più adatta a sfruttare le costruzioni es6 async e await inoltre, alcune idiosincrasie associate all'uso di parse sono state eliminate, ad esempio, le funzioni cloud restituiscono semplicemente una promise invece di utilizzare i error error o success success messaggi sull'oggetto response puoi aggiornare le tue app su back4app facilmente dal tuo dashboard questa guida dimostrerà come aggiornare il tuo codice per sfruttare le nuove funzionalità di 3 1 per seguire questa guida sei invitato a dare un'occhiata al https //github com/back4app/parse server break changes fornito questo è un tutorial per ospiti scritto da https //github com/considine , sviluppatore principale di https //koptional com/ obiettivi aggiornare il tuo back4app parse server a 3 1 e migrare il tuo cloud code di conseguenza prerequisiti per completare questo tutorial, hai bisogno di ° un'applicazione back4app esistente che utilizza parse server 2 x ° segui il https //www back4app com/docs/get started/new parse app per imparare come creare un'app su back4app riepilogo delle modifiche le modifiche più notevoli sono le seguenti 1\ cloud code funziona con parse sdk 2 x in precedenza, cloud code funzionava con parse sdk 1 x con parse server 3 1, funziona con parse sdk 2 x guarda https //github com/parse community/parse sdk js/releases per capire meglio cosa comporta questo importante aggiornamento di versione comporta principalmente correzioni di bug aggiunge anche https //parseplatform org/parse sdk js/api/2 1 0/parse query html#containedby e https //parseplatform org/parse sdk js/api/2 1 0/parse query html#includeall metodi di query, così come la possibilità di recuperare un oggetto con includes 2 aggiornamento aggregato dalla versione parse 2 7 1, puoi utilizzare il https //parseplatform org/parse sdk js/api/2 1 0/parse query html#aggregate su una query questo ti consente di sfruttare un po' di più il database sottostante ora, la sintassi per il https //parseplatform org/parse sdk js/api/2 1 0/parse query html#aggregate su parse query parse query è stata aggiornata puoi eseguire una query utilizzando due fasi la fase match match e la fase group group 1 // corrisponde agli utenti il cui nome è foo e raggruppa per il loro objectid 2 const pipeline = \[{ group { objectid {} } }, { match { name 'foo' } }]; 3 4 var query = new parse query("person"); 5 query aggregate(pipeline) in precedenza, non era necessario il campo pipeline nell'oggetto pipeline a causa dell'api sottostante, ora devi includere esplicitamente il campo pipeline il valore dovrebbe essere un array di una o due fasi, contenente group group e match match guarda https //docs parseplatform org/js/guide/#aggregate per esempi più specifici 3 ottimizzazioni sotto il cofano sono state apportate alcune ottimizzazioni sotto il cofano ad esempio, un https //parseplatform org/parse sdk js/api/2 1 0/parse livequery html recupererà i permessi a livello di classe (clp) insieme ai dati per prevenire l'accesso doppio al database 4\ email di ripristino di parse quando si richiede un'email per il reset della password, il server restituirà un successo anche se quell'email non è salvata inoltre, i token per il reset della password scadono quando l'email di un utente viene reimpostata 5\ aggiornamento dei trigger cloud con questo rilascio, puoi condividere dati tra i https //docs parseplatform org/cloudcode/guide/#beforesave triggers e https //docs parseplatform org/cloudcode/guide/#aftersave triggers trigger sullo stesso oggetto ad esempio 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 }); puoi vedere di più sui cambiamenti nel parse server nel changelog ufficiale di parse 3 1 cliccando https //github com/parse community/parse server/blob/alpha/changelog md 6\ miglioramento di livequery il client parse livequery ti consente di iscriverti a query e ricevere aggiornamenti dal server man mano che arrivano le query tradizionali vengono eseguite una sola volta dal client, quindi questo è molto utile per casi come la messaggistica, ecc con back4app puoi anche https //www back4app com/docs/platform/parse server live query example con il rilascio della versione 3 x, la comunità di parse ha migliorato il sistema per livequery https //docs parseplatform org/js/guide/#security for other objects ora puoi passare un token di sessione al metodo subscribe di una live query, e il parse server gestirà solo il ritorno dei risultati a cui questo utente ha accesso ad esempio, un utente può avere accesso in lettura/scrittura a determinati ‘messaggi’, ma non a tutti 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); il codice sopra si iscriverà automaticamente a tutti i messaggi a cui l'utente ha accesso, sollevandoti dalla responsabilità di interrogare messaggi specifici la parte principale delle modifiche riguarda il modo in cui viene gestito il cloud code per questo, vedere la guida alla migrazione qui sotto 1 allineare i fondamenti tecnici inizieremo con un esempio di progetto cloud utilizzando la versione 2 x in questo modo possiamo navigare attraverso le modifiche appropriate della sintassi puoi vedere https //github com/back4app/parse server break changes per questo progetto esempio se sei familiare con async e await, puoi saltare questa sezione l'evoluzione del codice asincrono in javascript appare più o meno così https //developer mozilla org/en us/docs/glossary/callback function https //developer mozilla org/en us/docs/web/javascript/reference/global objects/promise https //developer mozilla org/en us/docs/web/javascript/reference/statements/async function qualsiasi applicazione javascript moderna utilizzerà probabilmente tutte e tre le funzioni di callback comportano il passaggio di una funzione come argomento a un'altra funzione questa seconda funzione può eseguire la prima a un certo punto 1 // callbacks 2 // executes callback function after waiting 100 milliseconds 3 settimeout(function() { 4 alert('my callback function'); 5 }, 100); i callback sono essenziali ma possono essere ingombranti quando si tratta di concatenarne molti in particolare, annidare diversi livelli può essere difficile da leggere e la gestione degli errori si dimostra complicata pertanto, in es2015 è stata introdotta la promise 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)); le promesse migliorano la leggibilità della programmazione asincrona rendono anche le pipeline più esplicite ma sono stati fatti progressi ancora maggiori in https //www ecma international org/ecma 262/8 0/#sec async function definitions con le costruzioni async / await il tuo codice può ora attendere i risultati di una promise senza fare affidamento sui blocchi then / catch (che possono anche diventare difficili da leggere) 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 } forse per un esempio molto semplice, questo potrebbe non sembrare più elegante delle semplici promesse ma attendere i risultati di una funzione asincrona è spesso esattamente ciò che vogliamo fare pertanto, ottimizza davvero la leggibilità del nostro codice supporto per async/await come già accennato, async/await è stato incluso nella https //www ecma international org/ecma 262/8 0 (es8) per il codice server, la versioning è raramente un problema poiché puoi aggiornare a https //node green/#es2017 stai tranquillo, l'ambiente di back4app supporta versioni stabili recenti per il codice del browser, i transpiler come https //babeljs io/ produrranno un es2016 compatibile con codice che utilizza async / await e funziona nei browser moderni 2 pensare al tuo codice in modo diverso il cambiamento principale con il cloud code riguarda ciò che fa lo sviluppatore rispetto a ciò che fa la libreria in precedenza, gestivi esplicitamente la risposta poiché la maggior parte del cloud code verrà eseguita in modo asincrono effettuando query e scritture nel database ha più senso restituire una promise, riducendo il codice boilerplate l'intuizione dietro le funzioni cloud è che c'è una configurazione e un'impostazione minime coinvolte nella scrittura di codice lato server questa release incarna quell'idea; tienilo a mente mentre stai rifattorizzando e creando nuove funzioni per mostrare come funzionano le funzioni cloud code in parse server 3 1, abbiamo riscritto un esempio funzionale di cloud code da una versione di parse server prima della migrazione puoi trovare questo codice cliccando https //github com/back4app/parse server break changes/tree/step 1 la stessa funzione cloud code è scritta in parse 3 1 come mostrato di seguito 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 aggiungere tutti i marker async qualsiasi funzione che utilizza await deve essere dichiarata con il modificatore async questa semplice rifattorizzazione attaccherà async a tutte le cloud functions sostituirà anche queste con https //developer mozilla org/en us/docs/web/javascript/reference/functions/arrow functions poiché sono più concise in questo caso (e ciò che utilizza la guida ufficiale aggiornata di parse) 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 } il tuo codice apparirà come https //github com/back4app/parse server break changes/tree/step 2 dopo questa rifattorizzazione niente di strano finora nel prossimo passo, otterremo il giusto valore per questo cambiamento 4 rimuovere i riferimenti alla risposta, utilizzare await il tuo codice apparirà come https //github com/back4app/parse server break changes/tree/step 3 dopo questo refactoring questo passaggio è un po' più complicato dobbiamo rimuovere tutti i riferimenti alla variabile ‘response’, restituendo invece una promessa nel caso di più funzioni di query/salvataggio, attendere la risposta controlla il metodo di creazione del commento per vedere come viene fatto 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 }); nota che ora viene generato un errore javascript invece di chiamare response error parse gestirà la trasformazione di questo in una risposta per noi cancellare un ‘post’ o un ‘commento’ implica prima di tutto ottenere l'oggetto, poi distruggerlo utilizzando ‘await’, il metodo di distruzione può accedere all'oggetto salvato al di fuori di un blocco questo completa tutto il refactoring necessario per la migrazione vale a dire, se arrivi fino a questo passaggio, congratulazioni! il tuo codice funzionerà su back4app parse 3 1! 5 trucchi avanzati (opzionale) le seguenti modifiche sono opzionali ma possono ridurre significativamente il tuo codice trovo che riducano il boilerplate probabilmente hai notato molti controlli manuali per i parametri o l'utente autenticato questi garantiscono che non si verifichino comportamenti strani ad esempio, abbiamo deciso che il nostro oggetto ‘post’ ha bisogno di testo, quindi se non viene passato alcun parametro ‘text’, l'oggetto verrà salvato senza di esso un modo per prevenire questo è controllare che il testo sia stato passato ma i controlli manuali possono richiedere tempo e risultare poco eleganti in questa sezione, sfruttiamo https //developer mozilla org/en us/docs/web/javascript/reference/operators/destructuring assignment per completare implicitamente questi controlli dovresti vedere la documentazione sopra se non sai cos'è la destrutturazione ma in breve, ti consente di trasformare una proprietà di un oggetto in una variabile con una sintassi molto concisa 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 la destrutturazione è meno verbosa rispetto all'assegnazione manuale permette anche di dichiarare variabili di parametro al volo, il che è bello 1 parse cloud define('posts\ get', async ({ params { id } }) => { 2 // id is declared 3 }); quando combinato con una notazione es2015 per https //developer mozilla org/en us/docs/web/javascript/reference/operators/object initializer#new notations in ecmascript 2015 possiamo ottimizzare i nostri controlli sui parametri possiamo farlo 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 quindi, per il nostro codice parse, possiamo fare così 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 }); se questo è scoraggiante, non preoccuparti il https //github com/back4app/parse server break changes/tree/step advanced potrebbe aiutare in breve, ‘assertparams’ è una funzione di utilità per generare un errore se un valore è indefinito possiamo controllare i parametri in un colpo solo combinando la destrutturazione degli oggetti e l'inizializzazione degli oggetti es2015 questo rimuove otto o nove controlli manuali che iniziano a diventare sgradevoli dopo un po' 6 aggiornamento su back4app una volta migrato il tuo codice, devi fare altre due cose per farlo funzionare su back4app aggiorna la versione del tuo server back4app carica il tuo nuovo codice cloud ho brevemente menzionato il primo passo prima tutto ciò che devi fare è accedere a back4app e andare al dashboard della tua app da lì, seleziona semplicemente “impostazioni del server” a sinistra, seguito dal pulsante “impostazioni” nella scheda “gestisci parse server” puoi quindi selezionare il pulsante radio del parse server 3 1 1 e fare clic su “salva” ultimo ma non meno importante, puoi caricare il tuo codice tramite il https //blog back4app com/2017/01/20/cli parse server/ , o dal tuo dashboard utilizzando il caricamento manuale vedi https //www back4app com/docs/android/parse cloud code se hai bisogno di ulteriori informazioni su questo passaggio note sul lancio di una nuova versione se il tuo codice è complesso, potrebbe essere una buona idea eseguire alcuni test prima di fare questi due passaggi back4app ha alcune guide su come farlo https //www back4app com/docs/advanced guides/parse cloud code testing e https //www back4app com/docs/cloud code functions/unit tests infine, è importante notare che queste modifiche sono breaking utilizzare il codice che abbiamo scritto su un server parse 2 x fallirà, e utilizzare codice 2 x su un server 3 1 fallirà anch'esso pertanto, devi assicurarti di aggiornare la tua versione di back4app parse proprio quando carichi il tuo cloud code aggiornato se hai molti utenti e sei preoccupato che il caricamento del codice e l'aggiornamento della versione siano leggermente disallineati, puoi fare qualcosa del genere 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 } questo codice determina dinamicamente la versione e definisce le funzioni cloud in base a quella dopo aver caricato questo, cambieresti a 3 1, e poi potresti ricaricare il codice con la parte vecchia rimossa includere il controllo all'inizio assicura che non ci sia un punto in cui il tuo codice si bloccherà poiché puoi aggiornare e caricare in pochi secondi, di solito non è necessario conclusione in questa guida, abbiamo dimostrato semplicemente come migrare il tuo cloud code alla versione parse 3 1 ricorda di aggiornare la tua versione di back4app a 3 1 dopo aver apportato queste modifiche inoltre, è importante notare che questa guida ha dimostrato una sintassi migliorata che parse 3 1 sfrutta le nostre rifattorizzazioni hanno ridotto il codice da 160 righe a 90 e lo hanno reso molto più leggibile per le applicazioni reali, questo porterà dei benefici