‫Narratore: Ora, un'altra caratteristica estremamente importante
‫di una buona API è fornire l'impaginazione.
‫Quindi, in pratica, consentire
‫all'utente di selezionare solo una determinata pagina dei nostri risultati,
‫nel caso in cui abbiamo molti risultati.
‫Quindi supponiamo di avere, ad
‫esempio, 1000 documenti in una certa raccolta.
‫E diciamo che su ogni pagina abbiamo 100 documenti.
‫Quindi questo significherebbe che avremmo 10 pagine, giusto?
‫Quindi 10 per 100 fa 1000.
‫E quindi, in base a ciò, come implementeremo l'impaginazione utilizzando
‫o la stringa di query?
‫Bene, useremo la pagina e delimitare i campi.
‫Quindi ci sarà un campo pagina.
‫Diciamo che vogliamo la pagina due e
‫ci sarà un campo limite.
‫E questo limite qui significa sostanzialmente la quantità
‫di risultati che vogliamo per pagina.
‫E questo in realtà è impostato qui solo su
‫10 e ovviamente dobbiamo correggere questo qui.
‫Non è una virgola, ma una e.
‫Quindi pagina due e il limite 10.
‫Ora tornando all'esempio di 1000 risultati, se il
‫limite è 10, quindi solo 10 risultati per pagina,
‫allora avremo 100 pagine e
‫qui verrà visualizzata la pagina numero 2
‫di queste 100 pagine.
‫Va bene?
‫Ora, abbiamo bisogno di un modo per implementarlo usando Mongoose.
‫Quindi diamo un'occhiata a come potremmo farlo tornando
‫al nostro codice.
‫Quindi funzione numero quattro,
‫Pagination.
‫Va bene,
‫e inizierò costruendo qui una query di
‫esempio proprio come abbiamo fatto prima.
‫Quindi diciamo che la query è uguale query.
‫E ora che tipo di metodi
‫abbiamo per implementare l'impaginazione?
‫Bene, il più utile è saltare e
‫spiegherò cosa fa in un secondo, quindi mettiamo
‫un numero casuale qui.
‫Quindi salta e limita, e
‫mettiamo 10.
‫e quindi questo limite qui è in realtà esattamente lo stesso
‫del limite che abbiamo definito nella stringa di query.
‫Quindi fondamentalmente la quantità di risultati
‫che vogliamo nella query.
‫E poi skip, che abbiamo qui, è la quantità di risultati
‫che dovrebbero essere saltati prima di interrogare effettivamente i dati.
‫Va bene, di nuovo, questo è solo un segnaposto qui.
‫Torniamo a questo esempio che abbiamo qui.
‫Mi limiterò a copiare questa stringa di query qui.
‫quindi diciamo che l'utente vuole la pagina numero
‫due con 10 risultati per pagina.
‫Ciò significa che i risultati da 1 a 10 sono a pagina uno
‫e da 11 a 20 a pagina 2.
‫Ok, questo significa che vogliamo saltare 10 risultati
‫prima di iniziare effettivamente a interrogare.
‫Va bene.
‫Quindi, di nuovo, da uno a 10 sono
‫per la pagina uno e poi
‫da 11 a 20 sono per la pagina
‫due, e così
‫via e così via.
‫Quindi da 21 a 30 sarà pagina tre, e così
‫via e così via.
‫E quindi dobbiamo saltare
‫10 risultati per arrivare al risultato numero 11, giusto?
‫Quindi al risultato numero 11 che sarà il primo a pagina due.
‫Ok, e poiché è stata richiesta la pagina due, di
‫nuovo dobbiamo saltare 10 risultati prima di
‫iniziare effettivamente la pagina due.
‫Va bene? Ha senso?
‫E per esempio, se richiedessimo la pagina numero
‫tre, beh, ovviamente, prima dovrebbero
‫essere saltati 20 risultati.
‫E quindi avremo bisogno
‫di un modo per calcolare questo valore di salto qui.
‫Quindi basato fondamentalmente sulla pagina e sul limite.
‫Ora potresti chiedere perché non chiedo direttamente il valore di
‫salto nella stringa di query, ma
‫questo perché per l'utente questo valore qui è una
‫specie di astratto, ok?
‫È molto più semplice dire semplicemente "Beh, voglio la pagina numero uno" o voglio la
‫pagina numero cinque "o voglio come
‫la pagina numero 10. " Ok,
‫quindi per l'utente è molto più facile non gestire
‫i valori di salto qui e
‫tutto il resto, l'utente vuole che sia facile
‫e definire solo una pagina.
‫Ora, prima di poter effettivamente
‫iniziare a calcolare il valore di salto, dobbiamo prima ottenere la
‫pagina e il limite dalla stringa di
‫query e dovremmo anche definire alcuni valori predefiniti.
‫Ok, questo è fondamentalmente
‫perché vogliamo ancora avere l'impaginazione
‫anche se l'utente non specifica alcuna pagina
‫o alcun limite.
‫Perché per esempio diciamo che abbiamo un milione
‫di risultati nel nostro
‫database, e poi ovviamente quando l'utente fa
‫la richiesta non mostreremmo semplicemente tutti questi 10 milioni di risultati.
‫Non sarebbe molto facile da usare, vero?
‫E così, definirò per impostazione predefinita il numero di pagina
‫uno e un limite di diciamo 100.
‫Quindi, per impostazione predefinita, quando un utente richiede tutti i
‫tour in questo esempio, ne ottiene solo 100
‫e non un milione, ok?
‫Quindi la pagina è ovviamente richiesta. interrogazione. page e ora
‫lo moltiplicherò per uno, che è solo
‫un bel trucco per convertire una
‫stringa in un numero.
‫Ok, forse hai notato prima che ogni volta che inseriamo
‫effettivamente un numero in una
‫stringa di query, sarà quindi una stringa o un
‫oggetto query, e quindi dobbiamo risolverlo semplicemente moltiplicando per uno.
‫Ok, e poi per impostazione predefinita, vogliamo la pagina numero uno.
‫Va bene?
‫E quindi questo è un bel
‫modo in JavaScript per definire sostanzialmente i valori predefiniti.
‫E sono sicuro che lo conosci, vero?
‫In ogni caso, il limite è su richiesta. interrogazione. limite di nuovo
‫uno per convertirlo, o il
‫valore predefinito di 100 che abbiamo appena menzionato.
‫Quindi idealmente l'utente specificherà solo il numero di pagina che richiede
‫e non si
‫preoccuperà nemmeno del limite di pagina.
‫Questo è per casi d'uso più specifici.
‫Ok, e ora tutto ciò che dobbiamo fare è definire quindi per calcolare
‫fondamentalmente quel valore
‫di salto di cui abbiamo appena parlato qui prima.
‫E il modo migliore per farlo è tornare a un esempio.
‫Quindi, di nuovo, diciamo che stiamo richiedendo la pagina numero tre,
‫con il limite di 10.
‫e vediamo qui per la pagina numero tre i risultati sono
‫da 21 a 30.
‫Quindi inizia dal risultato numero 21, il che significa che
‫dobbiamo saltare 20 risultati.
‫E 20 risultati sono fondamentalmente due volte 10,
‫quindi due volte questo limite.
‫Ok, e da lì iniziamo a ottenere una formula.
‫Quindi due per dieci è fondamentalmente tre meno uno per 10.
‫E tre è la pagina su cui siamo.
‫Quindi questa è la nostra formula.
‫Quindi pagina meno uno e quindi
‫la pagina precedente, in pratica,
‫moltiplica il
‫limite.
‫Ok, quindi spero che avesse senso,
‫ora sostituiamo questi valori qui.
‫Salta
‫e limite del limite.
‫Va bene?
‫Quindi, in pratica, questo numero qui è tutti i risultati che
‫vengono prima della pagina che stiamo effettivamente richiedendo ora.
‫Quindi, di nuovo, se stiamo richiedendo la pagina numero tre,
‫i nostri risultati inizieranno dalla pagina numero 21.
‫E quindi vogliamo saltare 20 risultati prima di quello.
‫E quindi 20
‫risultati sono perché abbiamo 2 pagine per 10 risultati
‫ciascuno, sì, sarà la pagina che abbiamo appena richiesto.
‫Quindi pagina qui, meno uno, quindi
‫la pagina precedente moltiplica il numero di risultati su
‫ciascuna pagina.
‫Ok, questa è la quantità di documenti
‫che verranno saltati.
‫Ok, quindi spero che abbia avuto senso.
‫Ora andiamo avanti e proviamo effettivamente questo.
‫E poiché abbiamo solo così pochi risultati qui,
‫dobbiamo testarlo con un limite davvero piccolo.
‫Quindi diciamo che vogliamo solo tre risultati per pagina e
‫iniziamo dalla pagina numero uno.
‫Quindi invialo, e infatti ora otteniamo solo tre
‫risultati come puoi vedere qui.
‫Quindi questi tre, vediamo.
‫Quindi The Forest Hiker, The
‫Sea Explorer e The
‫City Wanderer.
‫Va bene?
‫Proviamo con la pagina numero
‫due, e per qualche ragione il postino continua
‫a saltare ogni volta che cambio l'URL.
‫Ad ogni modo, ora abbiamo The Park
‫Camper, The Snow
‫Adventurer e The Sports Lover.
‫Quindi inizi a vedere che
‫in realtà ora abbiamo tour diversi.
‫Va bene?
‫E quindi possiamo dire che la nostra impaginazione
‫qui sta già funzionando.
‫Ora l'ultima pagina
‫e ora abbiamo The Northern Lights,
‫The Wine
‫Taster e The Star Gazer.
‫Va bene?
‫E se provassimo ad andare alla pagina numero quattro?
‫Sappiamo già che abbiamo solo nove
‫tour, quindi a pagina numero quattro non dovrebbe esserci nulla.
‫Destra?
‫Quindi proviamolo.
‫E infatti otteniamo zero risultati.
‫Ma questo ovviamente non è l'ideale.
‫Ok, quindi ora andiamo avanti e risolviamo il problema
‫e fondamentalmente generiamo un errore ogni volta che
‫l'utente seleziona una pagina che non esiste.
‫Perché questa è fondamentalmente la situazione qui.
‫L'utente ha richiesto una pagina che semplicemente non esiste.
‫Non abbiamo abbastanza risultati per avere quattro pagine con
‫tre risultati.
‫Facciamolo ora, e questo in
‫realtà accadrà solo
‫quando c'è una pagina sulla query
‫e quindi creiamo effettivamente questa istruzione if qui.
‫Quindi, se richiesta. interrogazione. pagina, solo in
‫questo caso verificheremo se stiamo saltando più
‫tour di quanti ne abbiamo effettivamente.
‫Quindi prendiamo la quantità di tour.
‫Quindi il numero di tour è uguale a, e ora
‫impareremo effettivamente un nuovo metodo.
‫Quindi c'è un nuovo metodo
‫sul modello Tour che si chiama countDocuments.
‫Va bene? E come dice il
‫nome, questo restituirà il numero di documenti, ok?
‫In realtà restituirà una promessa, ma
‫poi aspettiamo la promessa e
‫quindi tornerà con
‫il risultato della quantità di tour.
‫Va bene? E quindi se il numero di
‫documenti che saltiamo è maggiore del numero di documenti che
‫effettivamente esistono, allora significa che la pagina non esiste, va bene?
‫Questo ha senso?
‫Quindi, se skip è maggiore del numero di
‫tour, e per ora
‫quello che farò qui è lanciare un nuovo errore.
‫Va bene?
‫Quindi lancia un
‫nuovo errore questa pagina non esiste.
‫Ora perché sto generando un errore qui?
‫Bene, semplicemente perché se lancio un
‫errore qui nel triblocco in cui ci
‫troviamo attualmente,
‫si sposterà automaticamente e immediatamente al blocco
‫catch, e quindi invierà questo tipo di messaggio di errore 404.
‫Va bene?
‫E quindi è quello che vogliamo per ora.
‫Tieni presente che implementeremo una gestione degli errori molto migliore
‫un po' più avanti nel corso.
‫E proprio nella prossima sezione, ok?
‫Ma per ora cerchiamo di mantenerlo semplice,
‫lanciamo questo errore qui nel caso
‫in cui stiamo cercando di saltare più documenti di quelli
‫che abbiamo effettivamente.
‫Va bene?
‫Quindi questo è il caso giusto, mandiamolo qui e
‫non è il risultato che mi aspettavo, quindi torniamo
‫indietro, quindi in questo
‫momento la nostra pagina è quattro
‫e il limite è tre.
‫Quindi il salto qui sarebbe tre per tre, quindi nove, ok?
‫E anche il numero di tour è nove,
‫quindi lo skip non è maggiore del numero di tour
‫e quindi non riceviamo questo errore.
‫Quindi quello che dobbiamo fare è impostarlo su maggiore o uguale.
‫Ok, quindi ora dovrebbe funzionare.
‫E ci vuole molto tempo, e così
‫è stato.
‫Ora otteniamo lo stato di errore qui e
‫un 404.
‫Per
‫qualche motivo questo errore non viene visualizzato
‫qui, come dovrebbe effettivamente.
‫Ma non preoccuparti, non è molto importante.
‫Ciò che conta è che è effettivamente entrato nel nostro blocco
‫catch e quindi ha inviato questa risposta 404.
‫Tutto il resto lo implementeremo un po' più tardi.
‫Ok, e in effetti è così.
‫Quindi questi sono tutti i metodi che aggiungeremo alla nostra
‫query, e così quando finalmente raggiungeremo la prossima riga di
‫codice qui, la nostra query
‫sarà attesa e tornerà con i tour.
‫Ok, e a questo punto la nostra query potrebbe
‫effettivamente assomigliare a
‫qualcosa del genere, quindi qualcosa
‫del
‫genere, qualcosa del genere cosa abbiamo
‫qui abbiamo sort,
‫select, quindi potremmo avere sort,
‫e poi alcuni select lì
‫abbiamo anche skip
‫abbiamo limite anche, e quindi
‫è davvero una specie di grande query.
‫E ancora, ciò che ci consente ciò
‫è che ciascuno di questi metodi qui restituirà sempre una
‫nuova query che possiamo quindi concatenare al metodo successivo
‫e al
‫metodo successivo e al metodo successivo fino a quando non aspettiamo finalmente
‫la query in modo che possa effettivamente darci i nostri documenti.
‫Ok, quindi liberiamoci di tutti questi commenti e
‫sì, per ora è tutto.
‫Per queste funzionalità ne aggiungeremo solo un'altra
‫nella prossima lezione,
‫ma sarà un po' diversa da queste.
‫Non utilizzerà uno di questi metodi di query, ok?
‫Quindi spero che nelle ultime due lezioni
‫tu abbia davvero imparato
‫i dettagli dell'interrogazione dei dati con Mongoose.
‫Quindi, ovviamente, tutti questi metodi che abbiamo usato non
‫sono utili solo per queste funzionalità che abbiamo implementato qui.
‫Puoi davvero creare tutti i tipi
‫di query che puoi immaginare per tutti i tipi di applicazioni.
‫Quindi ti ho mostrato tutte le tecniche qui
‫in questo contesto di queste diverse funzionalità
‫API, ma ovviamente sarai in
‫grado di usarle su tutte le tue applicazioni in futuro, ok?
‫Quindi spero che sia stato
‫divertente per te e se lo è stato, allora passiamo subito al prossimo.
‫Ci vediamo!