‫Istruttore: Bentornato, ora prima di approfondire la
‫gestione degli errori, scriviamo prima un gestore
‫per le rotte non definite.
‫Quindi fondamentalmente per le rotte a cui non abbiamo ancora
‫assegnato alcun gestore.
‫E per prima cosa, dobbiamo avviare la nostra applicazione
‫qui che non abbiamo chiuso dopo la recente sessione di debug.
‫Quindi MPM inizia.
‫E quindi aspettiamo una connessione al database.
‫Eccolo, e quindi ora andiamo da Postman qui e proviamo a percorrere
‫la via che non abbiamo ancora definito.
‫Quindi vado avanti, copio questo URL
‫qui, va bene, e
‫quindi per esempio diciamo
‫che
‫invece di tour apiV1, diremmo solo api/tours.
‫Ok, in quel caso otterremmo questo risultato HTML, va bene,
‫quindi Express invia automaticamente questo codice
‫HTML qui, insieme a un codice di errore 404
‫Not Found nel caso in cui non
‫ci sia alcun gestore per il percorso richiesto, ok.
‫Oppure, potremmo anche semplicemente scrivere in modo errato tour qui, ad esempio.
‫Quindi, ad esempio, in questo caso
‫otterremmo ancora lo stesso errore.
‫Ora c'è anche un'altra situazione che è
‫se qui dopo i tour specifichiamo qualcos'altro, diciamo solo
‫qualcosa del genere.
‫E quindi diamo un'occhiata all'errore che otteniamo, e
‫quindi ora otteniamo che il cast all'ID oggetto non è riuscito.
‫E questo perché in realtà
‫abbiamo un percorso che accetta un parametro ID qui dopo il tour/, giusto.
‫E quindi MongoDB sta fondamentalmente cercando di trovare un
‫documento con questo ID, ma non può convertirlo in un ID oggetto
‫MongoDB valido, va bene.
‫Quindi di nuovo questa è una situazione diversa, continuiamo a
‫lavorare con questo, quindi di nuovo, dove otteniamo questo
‫errore ma in questo modulo HTML.
‫Ora, dal momento che stiamo creando un'API
‫qui, non ha molto senso inviare HTML, giusto, quindi ora risolviamo
‫questo problema e fondamentalmente creiamo una funzione di gestione per
‫tutte le rotte che non sono memorizzate nella cache dai nostri router.
‫Ok, torniamo alla nostra applicazione qui e
‫apriamo l'app. js.
‫Ok, questa è fondamentalmente la definizione
‫della nostra applicazione Express.
‫Ora, prima di fare qualsiasi altra cosa,
‫liberiamoci di questo middleware qui di cui non
‫abbiamo più bisogno.
‫Quindi l'abbiamo usato qui solo per dimostrare
‫il concetto di middleware, e quindi a questo punto non
‫ne abbiamo più bisogno.
‫Bene, ora come implementeremo un gestore di rotte per
‫una rotta che non è stata memorizzata nella cache da nessuno
‫dei nostri altri gestori di rotte?
‫Quindi, per farlo, ricorda che tutte queste funzioni
‫del middleware vengono eseguite nell'ordine in cui si trovano nel codice.
‫E quindi l'idea è che se abbiamo una
‫richiesta che rientra in questo punto qui del nostro
‫codice, significa che né il tourRouter
‫né l'userRouter sono stati in grado di memorizzarlo nella cache, ok.
‫Quindi, se aggiungiamo un middleware qui dopo questi router, verrà
‫raggiunto di nuovo solo se non gestito da nessuno
‫dei nostri altri router, ok.
‫Quindi facciamolo e poi capiamo davvero come funziona dopo
‫che è già stato implementato.
‫Quindi implementeremo un gestore di route e
‫quindi diciamo app.
‫e ora il metodo HTTP per il
‫quale vogliamo specificare il percorso.
‫Ora potremmo usare get here right, quindi proprio come abbiamo fatto prima,
‫ma poi per quanto riguarda le richieste di
‫pubblicazione, eliminazione o patch?
‫Dovresti quindi scrivere gestori anche per questi, e
‫non lo vogliamo, vogliamo semplicemente gestire tutti
‫i percorsi, quindi tutti gli URL, per tutti i verbi proprio
‫qui in questo gestore, ok.
‫E così in Express, possiamo usare app. tutto.
‫E quindi verrà eseguito per tutti i
‫verbi, quindi tutto il metodo HTTP, va bene.
‫Successivamente specifichiamo l'URL, e poiché qui vogliamo gestire
‫tutti gli URL che non sono stati
‫gestiti prima di poter usare la stella qui, che
‫sta per tutto, va bene, e poi il resto è
‫solo una normale funzione middleware , proprio
‫come prima.
‫Quindi richiesta,
‫risposta e il prossimo.
‫Ok, e cosa vogliamo fare qui?
‫Bene, vogliamo semplicemente inviare una risposta
‫in formato JSON, quindi non l'HTML che abbiamo in questo momento.
‫Quindi ris. status,
‫e qui impostiamo un 404, quindi Not Found
‫e quindi una risposta JSON, quindi proprio come il solito in
‫cui impostiamo lo stato su fail.
‫Quindi solo una normale risposta formattata adiacente.
‫E poi una sorta di messaggio qui, e in
‫realtà facciamo una stringa modello
‫qui, perché voglio mettere una variabile lì dentro.
‫Quindi non posso,
‫trova.
‫E poi possiamo usare req. originalUrl va bene, quindi
‫questa è una proprietà che abbiamo sulla richiesta che
‫è come dice il nome, l'URL che è stato richiesto, va
‫bene.
‫Quindi questa nuova risposta che
‫invieremo indietro ora è molto migliore
‫dell'HTML che stavamo ricevendo in precedenza, quindi ora proviamolo.
‫E infatti, ora riceviamo un messaggio di errore JSON qui.
‫E quindi qui otteniamo anche l'URL che è stato richiesto, e
‫in effetti è quello a cui
‫abbiamo provato ad accedere, ma non è disponibile, va bene, fantastico.
‫Ora di nuovo, perché ha funzionato?
‫Quindi, di nuovo, l'idea è che se siamo in grado di raggiungere
‫questo punto qui, significa che il ciclo di risposta
‫alla richiesta non era ancora
‫terminato a questo punto nel nostro codice, giusto.
‫Perché ricorda che il middleware viene aggiunto allo
‫stack del middleware nell'ordine in cui è
‫definito qui nel nostro codice.
‫E quindi fondamentalmente questo codice qui viene eseguito per
‫primo, e quindi se il percorso fosse abbinato qui
‫nel nostro tourRouter, la nostra richiesta non raggiungerebbe nemmeno questo codice
‫e quindi questo non verrebbe eseguito.
‫E quindi questa dovrebbe essere fondamentalmente l'ultima
‫parte dopo tutte le nostre altre vie, d'accordo.
‫E se lo fossi,
‫solo per provarlo, ora mettilo in
‫cima alla nostra applicazione, allora vedrai che non
‫importa quale richiesta faremo, otterremo sempre la stessa risposta.
‫Bene, quindi proviamolo, e
‫in effetti ora riceviamo il messaggio di errore
‫JS, e questo perché tutte le
‫richieste ora raggiungono questo gestore di route qui, ed
‫è effettivamente abbinato perché è una richiesta GET, che fa parte di tutti
‫i verbi, giusto, e quindi tutti i percorsi, quindi tutti gli
‫URL sono memorizzati nella cache qui, e
‫quindi ovviamente gestisce quell'URL che abbiamo appena fatto qui.
‫E lo stesso ovviamente, ad esempio per un tour di eliminazione.
‫Quindi accadrebbe la stessa cosa, otterremmo
‫sempre la stessa risposta, va
‫bene.
‫Quindi, ovviamente, rimettiamolo a posto,
‫ma questo era solo per dimostrare come e perché
‫funziona, d'accordo.
‫Ottimo, quindi questa è una parte importante per rendere la
‫nostra API un po' più user friendly, ma ora iniziamo
‫a conoscere la gestione degli errori reali.