‫Istruttore: Facciamo ora un ulteriore
‫uso della nostra attività di classe
‫AppError aggiungendo un paio di errori 404 e alcune
‫delle nostre funzioni di gestione del tour.
‫Ora, solo una cosa che
‫volevo dire prima di implementare effettivamente questi errori
‫404 è che ovviamente avremmo potuto usare la funzione
‫catchAsync anche nel nostro router, ok?
‫Quindi, lascia che ti mostri come funzionerebbe.
‫Quindi, qui in
‫TourRoutes, avrei potuto racchiudere questa
‫funzione qui in catchAsync proprio come questo
‫invece di farlo proprio qui nel controller.
‫Quindi, qui dove l'ho fatto in effetti, giusto?
‫E questo avrebbe avuto lo stesso identico
‫risultato, ma non
‫l'ho fatto in questo modo perché
‫in questo modo devo ricordare
‫quale di questi metodi qui
‫è effettivamente un metodo di sincronizzazione, ok,
‫quindi solo su quelli aggiungo effettivamente la funzione catchAsync , Giusto?
‫Ora, in questo caso, in realtà sono tutte funzioni
‫asincrone e quindi, non è proprio questo il problema qui
‫in questo esempio, ma ci
‫saranno alcuni esempi in seguito in cui non tutti i gestori
‫sono funzioni
‫asincrone e quindi, in quel
‫caso, avrei davvero per ricordare quale di loro devo
‫avvolgere in catchAsync
‫e quali no e quindi,
‫farlo nel controller è molto più semplice perché semplicemente ogni
‫volta che scrivo una
‫funzione asincrona qui, loro lo
‫sanno già bene, ho bisogno di avvolgere in catchAsync.
‫Bene.
‫Quindi, non lo sto
‫facendo qui, lo faccio solo come ti ho mostrato nell'ultimo video.
‫Ok e in realtà una volta mi sono imbattuto in un
‫bug che era davvero
‫difficile da trovare perché in realtà
‫ho inserito una funzione che non era asincrona in
‫catchAsync e quindi non funzionavamo davvero e
‫non riuscivo a capire dove fosse il bug e
‫ho sprecato un sacco di tempo su quello.
‫E così, da allora, non metto più catchAsync qui ma molto
‫vicino a dove ne ho effettivamente bisogno,
‫così vicino al codice che in realtà è asincrono.
‫Ok, detto questo,
‫ora implementiamo alcuni errori 404 qui.
‫Bene, quindi voglio
‫iniziare mostrandovi di nuovo l'esempio
‫che abbiamo fatto nell'ultimo video.
‫Ok, quindi abbiamo provato a fare un
‫tour per questo strano ID che in realtà non
‫esiste e
‫l'errore che abbiamo ottenuto è che in
‫pratica Mongoose non è riuscito a convertire
‫questa stringa qui in un ID valido per MongoDB.
‫Ma cosa succede quando utilizziamo effettivamente un ID MongoDB valido?
‫Quindi, per esempio, copiamo questo qui, ok, e
‫questo
‫ovviamente avrà un risultato e quindi cambiamolo
‫leggermente, quindi per esempio, cambiando questo a
‫zero qui sarà ancora un
‫ID valido , quindi sembra
‫così e sembra
‫esattamente lo stesso di prima,
‫ho appena cambiato
‫un numero ma questo ID probabilmente non esisterà.
‫E quindi, vediamo cosa otteniamo allora.
‫E infatti, ora il nostro risultato qui è nullo.
‫Va bene, quindi non è proprio quello che vogliamo, vero?
‫Quello che vogliamo qui è mostrare un codice di stato 404 qui e
‫dire che questo tour non è stato trovato.
‫Ok, ora usiamo la classe orAppError
‫per implementarlo.
‫Tieni solo a mente
‫che il tour che facciamo qui è nullo, ok?
‫Quindi, null che ora possiamo verificare.
‫Quindi, se andiamo al nostro gestore getTour,
‫implementiamo ora se non c'è tour e in quel caso creeremo un
‫errore e questo qui funziona perché
‫se
‫non c'è tour,
‫sarà nullo.
‫Ricorda e in JavaScript, null è un valore di errore, quindi
‫un valore che verrà convertito in falso qui
‫in un'istruzione if.
‫Ok, quindi, se non c'è tour,
‫allora tour è
‫falso e non falso è ovviamente vero
‫e quindi è così che inseriamo questo blocco if.
‫Allora, cosa vogliamo fare se non c'è il tour?
‫Bene, vogliamo creare il prossimo con un errore.
‫Quindi, per saltare direttamente all'errore e al
‫middleware collegato.
‫Quindi, facciamo un nuovo AppError che
‫non è ancora disponibile, dobbiamo
‫ancora importarlo ma usiamolo qui subito.
‫Ok, quindi diciamo
‫solo che nessun tour è stato trovato con quell'ID.
‫E poi un codice
‫di stato ricorda che il secondo argomento è 404, va bene?
‫Ora un'ultima cosa che dobbiamo fare
‫qui, vale a dire restituire, ok perché vogliamo
‫restituire questa funzione immediatamente e non passare
‫alla riga successiva che sarebbe questa e
‫che fondamentalmente proverebbe
‫a inviare due risposte e noi ha già riscontrato quell'errore prima,
‫quindi spero che te lo ricordi
‫e questo è il
‫motivo per cui abbiamo sempre bisogno di tornare qui.
‫Ok, ora andiamo avanti e importiamo rapidamente l'appError ed
‫è simile a questo qui,
‫quindi duplichiamo.
‫Ok, e qui in realtà è con la A maiuscola.
‫Va bene, salvalo e ora
‫proviamolo di nuovo e
‫ora in effetti non è stato trovato nessun tour con quell'ID 404.
‫Perfetto, quindi esattamente quello che volevamo.
‫Oh e hai anche visto che abbiamo fallito qui.
‫Ok, quindi anche questo viene da o classe.
‫Ottimo, quindi funziona e quindi spero davvero
‫che tu abbia capito esattamente come funziona ora tutta
‫questa gestione degli errori.
‫Ok, quindi creiamo di nuovo un errore e
‫poi passiamo quell'errore a next e
‫non appena next riceve qualcosa, presume che
‫si tratti di un errore
‫e passerà
‫direttamente al middleware di gestione degli errori globale
‫che invierà quindi la risposta per noi , bene?
‫Quindi, copiamo questo
‫e inseriamolo in tutti gli altri
‫gestori che interrogano i documenti in base all'ID.
‫Quindi, non creare un tour ma aggiorna un tour, ok?
‫E così,
‫qui lo stesso, se stiamo cercando
‫di aggiornare il tour
‫che non esiste, ci darà lo stesso identico errore.
‫Infine, ovviamente, lo stesso con l'eliminazione.
‫E ora vedi che ESLint mi ha dato questo errore qui
‫e quindi, questo perché questo tour non è definito
‫e in questo caso, ESLint mi ha davvero salvato qui
‫dalla creazione di questo bug.
‫Destra?
‫Quindi, ancora senza ESLint, probabilmente l'avrei semplicemente
‫incollato qui e l'avrei chiamato
‫un giorno senza
‫nemmeno notare che il tour non è definito da
‫nessuna parte all'interno di
‫questa funzione, ma poiché abbiamo installato questo strumento davvero prezioso,
‫ora posso andare avanti e risolverlo.
‫Va bene, quindi fino
‫a questo punto, abbiamo semplicemente aspettato questa istruzione di eliminazione qui e non
‫ne abbiamo salvato il risultato,
‫semplicemente perché non ne avevamo bisogno.
‫Ok, ma in questo momento ne abbiamo davvero
‫bisogno perché vogliamo questa variabile
‫di tour per verificare se c'è effettivamente un tour o meno.
‫Quindi, molto facile, const tour e poi uguale
‫a quel risultato, dai
‫un salvataggio e poi l'errore è sparito.
‫Quindi, fantastico.
‫ESLint al lavoro, va bene?
‫Ora forse hai notato che non ho aggiunto questo errore 404 qui
‫in questo gestore getAllTour.
‫Allora, perché l'ho fatto?
‫E quindi lascia che ti spieghi perché.
‫Quindi, quando non vengono trovati risultati, ad
‫esempio, non ci sono risultati corrispondenti a un filtro, o perché
‫la pagina è stata
‫richiesta che non esiste, allora ovviamente potremmo considerare di inviare
‫un errore 404 e dire che i
‫dati non erano trovato ma secondo me
‫e anche l'opinione di altri sviluppatori, ciò
‫non è del tutto corretto in questa richiesta perché
‫non c'era davvero un errore.
‫Voglio dire, la richiesta è stata ricevuta correttamente.
‫Il database ha cercato correttamente i tour
‫e ha trovato esattamente zero record,
‫quindi questi zero record
‫sono esattamente ciò che invieremo indietro insieme al codice HTTP 200.
‫Va bene, quindi ancora una volta
‫ritengo che non possa esserci davvero un errore
‫quando un utente richiede tutti i tour a
‫meno che, ovviamente, non ci sia qualche errore nel database o
‫qualcosa del genere.
‫Ma in tal
‫caso, Mongoose genererà automaticamente un errore.
‫Giusto, che a sua volta verrà catturato dalla nostra
‫funzione o catchAsync e, come
‫già sapete, gestito nel
‫nostro gestore di errori globale e, come già
‫sapete, gestito
‫nel nostro middleware di gestione degli errori globale.
‫Va bene, ho detto queste parole così tante volte ormai.
‫Comunque, spero che abbia
‫avuto senso e quindi, sì, ora andiamo avanti.