‫Istruttore: In questo video, voglio
‫rifattorizzare molto rapidamente le funzionalità API che abbiamo implementato
‫nelle ultime due lezioni.
‫Ora, questo non serve solo a rendere il nostro codice un
‫po' più pulito, ma anche a renderlo più modulare e più riutilizzabile
‫in futuro.
‫Quindi, in questo momento, abbiamo tutto questo codice
‫per le funzionalità che abbiamo creato in precedenza in questa funzione getALLTours, giusto?
‫E questo sembra un po' disordinato.
‫È un po' difficile da capire, ok?
‫E immagina anche di voler utilizzare queste stesse funzionalità per
‫un'altra risorsa.
‫Ad esempio, per gli utenti o, in seguito, per le recensioni.
‫Non sarebbe molto pratico, in pratica, copiare
‫il codice da qui e usarlo,
‫quindi, nelle altre risorse, giusto.
‫E quindi, quello che farò,
‫ora, è creare una classe in cui aggiungerò un
‫metodo per ciascuna di queste caratteristiche o funzionalità API, come potresti
‫chiamarle anche tu.
‫Va bene?
‫Quindi, andiamo avanti e lo facciamo qui e
‫lo farò qui, per ora, poi, in seguito,
‫lo esporterò in un proprio file,
‫in pratica, per creare un modulo riutilizzabile che
‫possiamo , in seguito, importare in altri controller.
‫Va bene?
‫Quindi, classe, e lo chiamo APIFeatures.
‫Va bene.
‫Quindi, iniziamo con la nostra funzione di costruzione
‫e ricordiamo che questa è
‫la funzione che viene chiamata automaticamente non appena creiamo
‫un nuovo oggetto da questa classe, va bene.
‫Ora, cosa voglio effettivamente in queste funzionalità API?
‫In realtà, analizzerò due variabili qui, ok?
‫Quindi la query mangusta e anche la queryString che otteniamo
‫da express.
‫Quindi, fondamentalmente, venendo dal percorso, va bene.
‫Quindi questo è ciò a cui di
‫solito abbiamo accesso nel req. domanda, ok.
‫Ora, di nuovo, sto passando la query qui perché
‫non voglio interrogare all'interno di questa classe perché ciò rimbalzerebbe
‫questa classe sulla risorsa del tour ma, di nuovo,
‫voglio che sia il più riutilizzabile possibile.
‫Va bene.
‫Quindi, ciò che di solito facciamo in questa
‫funzione di costruzione è dire questo. query è uguale alla query che abbiamo ottenuto
‫come argomento e poi this. queryString
‫è uguale a queryString.
‫Va bene?
‫Quindi una funzione di costruzione molto semplice e molto tipica.
‫E ora, come ho detto, creerò
‫un metodo per ciascuna funzionalità, iniziando con il filtro.
‫Va bene.
‫E quindi, ora andiamo avanti e tagliamo il codice da qui.
‫Oppure, in realtà, lo copio e
‫lo commentano, in modo da non fare danni accidentali.
‫Quindi, copia il
‫commento e mettilo qui.
‫Quindi, un paio di cose che dobbiamo cambiare.
‫Prima su, richiesta. query non sarà disponibile all'interno
‫di questa classe.
‫Ecco perché abbiamo effettivamente analizzato la queryString.
‫E così, questo qui verrà sostituito con
‫questo. stringa della domanda.
‫Va bene?
‫Quindi, di nuovo, questo è solo Javascript di base.
‫In realtà non ha nulla a che fare con Note o Express.
‫Allora il resto qui va bene, ma questo qui non va affatto bene.
‫Quindi non voglio interrogare il tour direttamente qui, ricorda, ma invece,
‫voglio semplicemente aggiungere ora questa ricerca
‫alla query che abbiamo già.
‫Così questo. interrogazione. trova
‫e così, allora sarà questo.
‫Va bene?
‫Ora liberiamoci di questo.
‫E prima di aggiungere altri metodi qui, andiamo
‫avanti e usiamo questa classe solo così
‫ha più senso per te.
‫Va bene?
‫Quindi, come funzionerà effettivamente?
‫E farò tutto qui alla fine
‫qui sotto Esegui query.
‫Va bene?
‫Quindi, quello che posso fare ora è creare
‫una variabile chiamata Funzionalità, ad esempio.
‫E poi da qui, creerò un nuovo oggetto di funzionalità API.
‫Va bene?
‫Quindi, fondamentalmente, creando un'istanza di questa funzionalità API che
‫verrà quindi archiviata in Funzionalità.
‫E questo qui, quindi, avremo accesso a
‫tutti i metodi che definiremo nella definizione della classe.
‫Va bene?
‫Quindi, ricorda, qui dobbiamo passare una query
‫e queryString.
‫Quindi, la query, come ne creiamo una?
‫Ricorda, è Tour. trova.
‫Quindi, c'è un oggetto query e quindi, è quello
‫che abbiamo analizzato in questa classe e poi,
‫ovviamente, queryString che è req. interrogazione.
‫Ok, ora, su queste funzionalità qui, ricorda,
‫non abbiamo accesso al filtro.
‫E quindi, mettiamolo proprio qui dopo.
‫Così, . filtro.
‫Dagli un salvataggio.
‫E così, proprio in questo modo,
‫eseguiremo o codice per la funzionalità di filtro API.
‫Quindi, qui, la riga successiva, ovviamente,
‫non funzionerà perché questa query qui
‫non esiste più.
‫Invece, quello che abbiamo ora sono le caratteristiche. domanda, giusto?
‫Quindi, dopo tutta questa elaborazione ora, in pratica.
‫Ok, quindi, adesso, dopo questo filtro, questo. query avrà quindi questo
‫nuovo metodo di ricerca su di esso.
‫Ok, e quindi, di nuovo, questo viene memorizzato in questo. interrogazione.
‫E, in seguito, avremo tutti questi altri metodi che,
‫tutti, manipoleranno questo. query in
‫modo che, alla fine, this. query è la
‫query che vogliamo eseguire.
‫Quindi, proprio come qui.
‫Ok, quindi, proprio come qui, abbiamo sempre continuato a manipolare la
‫variabile di query.
‫Abbiamo continuato ad aggiungere sempre più metodi
‫fino a quando non l'abbiamo eseguito alla fine.
‫E così, qui, stiamo facendo esattamente lo stesso.
‫Stiamo semplicemente spostando il codice in tutti questi metodi.
‫Va bene?
‫Quindi, alla fine, come ho detto, la query verrà archiviata
‫all'interno di questa proprietà qui e quindi, sì, è lì che,
‫quindi, eseguiamo l'attesa e
‫otteniamo i risultati.
‫Va bene?
‫Ad ogni modo, continuiamo a muoverci qui e implementiamo l'ordinamento.
‫Quindi, copio e commento.
‫Quindi, filtra e il prossimo si chiama Ordina.
‫Va bene.
‫E quindi, ancora una volta, dobbiamo sostituire la richiesta. interrogare con
‫questo. queryString, ok.
‫E poi, la query ora è questa. interrogazione.
‫Quindi mettiamo questi quattro in questo. interrogazione.
‫Ok, ora, l'obiettivo qui è sostanzialmente
‫concatenare questi metodi qui uno dopo l'altro.
‫Quindi lascia che te lo mostri qui.
‫Quindi abbiamo filter e poi, dopo, vogliamo
‫concatenare il metodo sort.
‫Ora, proprio ora, non funzionerà
‫davvero perché dove stiamo effettivamente concatenando questo tipo?
‫Quindi, fondamentalmente, stiamo provando a chiamarlo sul risultato di questo ma, in
‫questo momento, qual è il risultato di questo?
‫Bene, non è davvero niente perché questo
‫metodo di filtro qui non restituisce nulla, giusto?
‫Ora, questo pezzo di codice qui,
‫ovviamente, restituisce l'oggetto che è stato appena creato e quindi,
‫quindi, possiamo concatenare il metodo filter su quello.
‫Ma il metodo del filtro, a sua volta, non restituisce nulla.
‫E quindi, a questo punto, non possiamo davvero chiamare
‫un ordinamento sull'oggetto, giusto?
‫E quindi, la semplice
‫soluzione a questo, e forse l'hai fatto in precedenza nel tuo
‫codice, è che ora dobbiamo restituire questo.
‫Quindi, restituisci questo e questo è semplicemente l'intero oggetto, ok?
‫E lo stesso, allora, quaggiù.
‫Quindi, restituisci questo.
‫Per restituire, ancora una volta, l'intero oggetto che, ovviamente, ha
‫accesso a questi altri metodi in modo che
‫possiamo, quindi, chiamarli lì.
‫Va bene?
‫Quindi, il prossimo è il limite.
‫E chiamerò questo limitFields.
‫E questo perché tutti
‫questi metodi avranno questi verbi come nomi.
‫Quindi è filtro, ordinamento, limite e l'impaginazione sarà
‫il prossimo.
‫Quindi, ancora una volta, req. la query ora è questa. queryString e query
‫here ora sono questo. interrogazione.
‫Va bene?
‫Restituisci questo e questo non è corretto.
‫Ok, e infine, l'impaginazione.
‫Copia, commenta.
‫Quindi, impaginare.
‫Restituisci questo e, ovviamente, dobbiamo
‫sostituire questi req. interroga questo.
‫stringa della domanda.
‫E poi qui, proprio come
‫prima, sarà questo. interrogazione.
‫E ho appena realizzato che lassù,
‫proprio nel primo metodo, non l'abbiamo fatto qui.
‫Quindi, abbiamo semplicemente detto questo. query e poi
‫ha aggiunto la ricerca lì.
‫Ma poi, ovviamente, dobbiamo salvarlo
‫effettivamente in questa proprietà di query.
‫Ok, quindi l'ho dimenticato.
‫E qui abbiamo qualche errore.
‫Va bene, questo non ha molta
‫importanza qui in questo momento.
‫O, in realtà, lo fa perché questa riga di codice qui
‫è in realtà nel nostro metodo paginate.
‫Quindi andiamo lì.
‫E, infatti, volevo proprio parlarti
‫di questo qui.
‫Perché, a pensarci bene, richiedere la pagina successiva,
‫che ha risultato zero, non è proprio un errore.
‫Il fatto che non ci siano risultati è sufficiente
‫perché l'utente si renda conto che, in sostanza, la pagina richiesta
‫non contiene alcun dato.
‫Quindi non abbiamo davvero bisogno di un errore in questa situazione.
‫E quindi, vado avanti e cancellerò tutto questo codice.
‫Va bene?
‫Quindi fammi salvare ora qui.
‫E così ora, ovviamente, l'errore è sparito.
‫E qui, dobbiamo anche continuare ad aggiungere
‫questi altri metodi.
‫Quindi, limitFields e . impaginare.
‫Dagli un salvataggio e, ancora, ricorda che tutto questo concatenamento
‫qui funziona solo perché dopo aver
‫chiamato ciascuno di questi metodi, lo restituiamo sempre.
‫E questo è l'oggetto stesso che ha accesso a
‫ciascuno di questi metodi qui,
‫rendendo possibile concatenarli proprio come lo abbiamo qui.
‫Ok, quindi, solo per ricapitolare:
‫stiamo creando un nuovo oggetto della classe delle funzionalità API.
‫Lì, stiamo analizzando un oggetto query e
‫la stringa di query che proviene da express.
‫Va bene?
‫Quindi, in ciascuno di questi quattro metodi
‫che chiamiamo uno dopo l'altro, fondamentalmente, manipoliamo la query.
‫Continuiamo ad aggiungere altri metodi proprio come abbiamo
‫fatto qui prima di fare qualsiasi di questo refactoring, giusto.
‫Quindi, continuiamo ad aggiungere cose alla query qui fino alla fine, e
‫poi, alla fine, aspettiamo semplicemente il risultato di quella query
‫in modo che possa tornare con tutti i documenti
‫che sono stati selezionati, ok?
‫E quella query ora vive su feature
‫che è questo oggetto qui.
‫Quindi caratteristiche. interrogazione.
‫Ok, spero che abbia senso.
‫Quindi, prima di fare qualsiasi altra cosa, torniamo da
‫Postman e proviamolo davvero.
‫E possiamo provarlo proprio qui con questo percorso Top-5-economico
‫perché, in realtà, dietro
‫le quinte, utilizza tutte queste funzionalità API, giusto.
‫Quindi, se lo mando, beh, funziona ancora.
‫Quindi è fantastico.
‫Quindi chiudiamolo e mi permetta di salvarlo effettivamente qui.
‫Quindi, ottieni i primi cinque tour economici.
‫E sì, lo lascerò lì alla fine.
‫E ora, proprio qui, facciamo alcuni test.
‫Ad esempio, rimuovi l'ordinamento, lasciami il limite.
‫Difficoltà, durata, prezzo.
‫Quindi, lascerò tutto questo
‫qui solo per vedere se funziona ancora.
‫E sembra che tutto funzioni ancora, giusto.
‫Quindi questi sono esattamente gli stessi risultati che
‫abbiamo ottenuto prima del nostro refactoring.
‫Quindi, fantastico, perfetto.
‫Ha funzionato e quindi, ora, eliminiamo effettivamente tutto questo codice
‫da qui, il che rende il nostro gestore di route
‫molto più pulito, non è vero?
‫Quindi, è molto meglio, davvero, è giorno e notte.
‫Va bene?
‫Ora, il prossimo passo è andare
‫avanti e prendere tutto questo codice, tagliarlo e inserirlo in un
‫nuovo file, quindi un nuovo modulo, in pratica.
‫Ok, e per questo, creerò una nuova cartella
‫qui che chiamerò Utils.
‫Quindi questo sta, fondamentalmente, per i servizi di pubblica utilità.
‫E aggiungerò un paio di cose qui
‫nel resto del corso.
‫Va bene?
‫Quindi questo
‫si chiamerà APIFeatures. js e qui con la F maiuscola.
‫Va bene?
‫Quindi, ecco la nostra classe e, alla
‫fine, facciamo un modulo. esportazioni di questa classe.
‫Quindi, niente di nuovo a questo punto.
‫Salvalo, chiudilo e
‫ora, qui, possiamo richiederlo.
‫Const APIFeatures quindi richiedono.
‫Quindi dobbiamo spostare una cartella
‫in alto, quindi in Utils e APIFeatures.
‫Va bene?
‫Un'altra prova.
‫E ci vuole un po' di tempo, e ci siamo.
‫Bello, è davvero bellissimo.
‫Ora, se creiamo di nuovo un'altra risorsa, ad esempio,
‫per gli utenti, sarà molto facile
‫inserire questa stessa funzionalità.
‫Tutto quello che dovremo fare è richiedere questo file e quindi,
‫in pratica, fare lo stesso di qui.
‫O forse, in quel caso, non vogliamo nemmeno
‫avere questa capacità di ordinamento o non vogliamo avere la
‫capacità di filtraggio e quindi, tutto ciò che dobbiamo fare è
‫semplicemente eliminare questa riga di codice.
‫E poi, come per magia, farà
‫solo queste tre
‫funzionalità o queste tre caratteristiche, ok.
‫E quindi, è davvero fantastico.
‫Spero che tu possa vedere
‫il valore di questo e, sì, sono davvero contento di questo risultato.