‫Narratore: In questo video parleremo del
‫secondo tipo di middleware Mongoose, che è
‫il middleware di query.
‫E, come dice il nome,
‫il middleware di query ci consente di eseguire funzioni prima
‫o dopo l'esecuzione di una determinata query.
‫E quindi ora aggiungiamo un hook pre-find,
‫quindi in pratica un middleware che verrà eseguito
‫prima che venga eseguita qualsiasi query di ricerca.
‫Quindi aggiungiamo un altro commento qui.
‫Quindi questo è il middleware delle query.
‫E, naturalmente, funziona in modo molto simile
‫a prima.
‫Quindi il tourSchema, e poi pre, e
‫qui definiamo il gancio, che sarà
‫"trova.
‫"Quindi, funzione, e ancora una volta,
‫abbiamo accesso alla funzione successiva.
‫E in effetti, iniziamo chiamandolo
‫qui alla fine in modo da non dimenticarlo.
‫Ok, e quindi vedi, che
‫sembra esattamente come l'altro middleware,
‫l'altro pre-hook.
‫L'unica differenza qui è davvero questo hook di ricerca, che
‫renderà questo middleware di query e
‫non il middleware di documenti.
‫Tutto ok?
‫Quindi, la grande differenza qui è
‫che la parola chiave this ora punterà alla query corrente e
‫non al documento corrente,
‫perché qui non stiamo realmente elaborando alcun documento.
‫Stiamo davvero elaborando una query.
‫Bene?
‫E il caso d'uso che faremo qui è questo.
‫Quindi supponiamo di poter avere
‫tour segreti nel nostro database, come
‫per i tour offerti solo internamente, o per un
‫gruppo molto piccolo, tipo VIP, di persone di cui il
‫pubblico non dovrebbe essere a conoscenza.
‫Ora, poiché questi tour sono
‫segreti, non vogliamo che i tour segreti appaiano mai negli
‫output dei risultati.
‫Destra?
‫Quindi quello che faremo è creare un campo tour
‫segreto e quindi interrogare solo i tour che non sono segreti.
‫Tutto ok?
‫Quindi, facciamolo.
‫Inizia aggiungendo qui e fallo alla fine.
‫secretTour, quindi il tipo dovrebbe essere un booleano, e penso che
‫questa sia la prima
‫volta che usiamo effettivamente un
‫booleano, quindi questo sarebbe vero o falso.
‫Quindi, se è vero, allora
‫è un tour segreto e non
‫vogliamo che venga visualizzato e, per impostazione predefinita, è falso.
‫Tutto ok?
‫E quindi, in fondo, di solito i tour non sono segreti.
‫Bene.
‫Successivamente, andiamo avanti e creiamo un tour segreto in
‫modo da poterlo provare a usarlo, ok?
‫Quindi chiamiamo questo qui il Super Secret Tour.
‫Tutto questo non
‫ha importanza, e lasciatemi dire che secretTour è davvero vero.
‫Bene?
‫Salvalo qui...
‫E, uh, dov'è quello?
‫Sì. Quindi secretTour è vero.
‫E ora andiamo effettivamente su Compass
‫ed eliminiamo tutti questi altri tour che abbiamo fatto lì.
‫Allora, ricarichiamo questo...
‫E poi, quaggiù, dovremmo avere...
‫Sì, questo tour di prova qui, possiamo cancellarlo.
‫Un altro giro di prova...
‫Quindi tutto questo disordine qui,
‫in pratica, vogliamo liberarcene.
‫Conserviamo solo il secretTour qui
‫in modo che ora possiamo sperimentarlo.
‫Ok, e qui vedi che secretTour è impostato su
‫true, mentre gli
‫altri, ovviamente, non hanno
‫questo attributo, perché, quando li abbiamo
‫creati, non avevamo ancora il secretTour.
‫Quindi, ora, appena prima di
‫iniziare, di nuovo a Postman, confermiamo che, in effetti,
‫è l'ultimo tour qui, e in realtà non è l'ultimo
‫tour, quindi dov'è?
‫Oh, è il primo.
‫Quindi qui abbiamo il Super Secret Tour,
‫ovviamente, impostato su true.
‫Tutto ok? Quindi, tornando indietro ora,
‫eseguiamo la query come abbiamo
‫appena detto all'inizio.
‫Quindi, di nuovo, tieni presente che questo qui
‫ora è un oggetto query, ok?
‫E così possiamo concatenare tutti i metodi
‫che abbiamo per le query.
‫E quindi questo aggiunge semplicemente un metodo di ricerca
‫qui, quindi in pratica
‫seleziona tutti i documenti in cui secretTour non è vero, ok?
‫Quindi tour segreto...
‫E poi non è uguale a vero.
‫E lo sto facendo così
‫perché, ricorda, gli editor non sono attualmente impostati su false.
‫Semplicemente non hanno questo attributo.
‫Tutto ok?
‫Ok, allora proviamolo di nuovo adesso.
‫E quindi ora dovrebbe essere sparito qui.
‫E infatti, non è più qui.
‫Ok, abbiamo tutti i tour che non sono segreti, ma
‫non il tour segreto.
‫E ora vedo che
‫in realtà abbiamo secretTour impostato su
‫false qui, ma in realtà è solo
‫una cosa di Mangusta, quindi diamo un'altra occhiata qui a Compass
‫e ricarichiamo.
‫E quindi vedi che, in realtà,
‫nel database, secretTour non è impostato su false.
‫Mongoose lo sta semplicemente aggiungendo perché lo abbiamo
‫nel nostro schema come predefinito e non è nel database.
‫E quindi è fondamentalmente, quindi, metterlo lì comunque.
‫Quindi vedi che in realtà abbiamo 11
‫documenti, ma poi qui in Postman otteniamo solo dieci risultati.
‫E questo,
‫ovviamente, perché il nostro tour segreto è sostanzialmente filtrato.
‫Bene?
‫Quindi, cerchiamo di capire di
‫nuovo cosa succede veramente.
‫Quindi non appena raggiungiamo questa rotta,
‫qui, usando il
‫metodo get, vediamo cosa succede.
‫Quindi, quello che succede è che creiamo una
‫query usando tour. trovare.
‫Bene?
‫E poi, ovviamente, concateniamo tutti questi
‫metodi ad esso come abbiamo detto in una
‫delle ultime
‫lezioni, e poi, alla fine, eseguiamo quella query qui usando wait.
‫Destra? Ricordati che?
‫Quindi è qui che eseguiamo la query.
‫Ma, prima che venga
‫effettivamente eseguito, viene eseguito il nostro middleware pre-trova qui.
‫Bene?
‫E viene eseguito perché è
‫find, proprio come abbiamo usato qui.
‫Destra?
‫Quindi, stiamo creando una query
‫di ricerca e quindi, quindi, viene eseguito l'hook di ricerca.
‫Quindi, qui, poiché è un middleware di query, la
‫parola chiave this punta alla query.
‫Quindi, a quella query, possiamo
‫concatenare un altro metodo di ricerca, giusto?
‫E lì dentro, filtriamo il secretTour usando
‫questo oggetto filtro.
‫Bene?
‫Quindi in pratica dicendo che vogliamo solo
‫tour in cui il secretTour non è uguale al vero.
‫E in effetti funzionerebbe allo
‫stesso modo se dicessimo semplicemente qui,
‫falso, ma lo trovo più pulito in questo modo.
‫Ok, ora c'è solo una cosa che dobbiamo correggere, perché in
‫questo momento questo middleware è in
‫esecuzione per find, ma non per find1.
‫Bene?
‫Quindi lascia che ti mostri il problema che potremmo avere con questo.
‫Quindi, prendiamo l'ID del tour segreto.
‫Quindi abbiamo il
‫tour segreto qui, e questo è il suo ID, e quindi se facciamo il
‫tour, allora questo dovrebbe darci il tour super segreto qui.
‫Destra?
‫E quindi vedi che
‫quel filtro che abbiamo appena creato
‫nel middleware non funziona per questo comando.
‫Bene?
‫E questo perché la funzione handle
‫per questo percorso,
‫come potresti ricordare, utilizza findByID, che, dietro le quinte,
‫è find1, e quindi è diverso da find.
‫Tutto ok?
‫Quindi, dobbiamo specificare lo stesso middleware anche per find1.
‫Ora, ci sono due
‫modi per farlo, e il primo sarebbe
‫semplicemente andare avanti, copiare questo codice e poi mettere find1 qui.
‫Ma non va
‫bene, quindi useremo un'espressione regolare.
‫Ed è abbastanza facile, e quindi...
‫E fammi semplicemente duplicare questo
‫qui, commentare
‫questo pezzo e poi, ricorda, un'espressione regolare
‫inizia e finisce con una barra.
‫E poi qui, quello che voglio
‫dire è che questo middleware
‫dovrebbe essere eseguito non solo per
‫find, ma per tutti i comandi che iniziano con il nome find.
‫Bene?
‫Quindi, trova e trova1, e anche trova1 ed elimina, trova1
‫e aggiorna, e
‫quindi tutti questi ora attiveranno effettivamente questa
‫funzione middleware che abbiamo qui.
‫Tutto ok?
‫Quindi, non ce n'è bisogno.
‫Questa espressione regolare qui è decisamente migliore.
‫Quindi di nuovo, questo
‫qui significa semplicemente tutte le stringhe che iniziano con find.
‫E in effetti, visto che siamo qui,
‫lascia che ti mostri di nuovo la documentazione di Mongoose.
‫Quindi, quando andremo qui, al middleware in queste guide, avrai una
‫panoramica di tutto il middleware.
‫Ad esempio,
‫il middleware dei documenti è quello di cui abbiamo
‫parlato prima, che viene eseguito, ad esempio, al salvataggio.
‫Ma in effetti, il middleware dei
‫documenti può anche essere eseguito per cose come la rimozione.
‫Tutto ok?
‫O per convalidare.
‫Ok, ma non ho parlato di questi
‫perché di solito quello che usiamo sempre è solo per salvare.
‫Ora, il middleware di query può essere eseguito per
‫tutte queste funzioni di query.
‫Quindi find, come abbiamo appena specificato,
‫e ora, con la nostra
‫espressione regolare, verrà
‫eseguito anche per find1,
‫findOneAndDelete, findOneAndRemove e findOneAndUpdate.
‫Comunque, tornando a Postman ora,
‫questo dovrebbe aver risolto la situazione qui.
‫Quindi, quando eseguiamo questa query, non
‫dovrebbe avere risultati.
‫E infatti, non lo fa.
‫Perché, ricorda, stavamo cercando di fare un tour segreto.
‫Quindi il tour con questo ID qui
‫è segreto, ma non vogliamo mai che
‫secretTours appaia in nessuna query.
‫Ed ecco perché, in questo momento, non otteniamo risultati.
‫Bene?
‫Quindi ora funziona.
‫Non salvare questo
‫e ora, torna al nostro codice.
‫Ora specifichiamo anche
‫un post middleware per find.
‫Quindi, tourSchema, e poi, proprio come prima, post, e poi usiamo di nuovo
‫la nostra espressione regolare qui per qualsiasi
‫cosa che inizi con find.
‫E poi solo una
‫normale funzione, e poi qui, nel middleware
‫post-find, otteniamo effettivamente l'accesso a tutti i
‫documenti che abbiamo restituito dalla query.
‫Quindi chiamiamolo Docs.
‫Tutto ok?
‫Quindi, ricorda che questo middleware verrà eseguito
‫dopo che la query è già stata eseguita.
‫E così, quindi, può avere accesso
‫ai documenti che gli sono stati restituiti.
‫Di nuovo, perché quella query
‫è già terminata a questo punto.
‫Quindi registriamo questi documenti sulla console,
‫quindi
‫docs, ma voglio anche fare qualcos'altro qui.
‫Quindi, in pratica, creiamo una specie
‫di orologio per misurare il tempo necessario
‫per eseguire la query corrente.
‫Tutto ok?
‫Allora, come lo faremo?
‫Beh, abbastanza semplice.
‫Possiamo semplicemente impostare una proprietà su questo oggetto, perché
‫questo oggetto query è in realtà solo un oggetto normale.
‫Ovviamente ha accesso a tutti questi metodi, come find,
‫ma possiamo
‫anche usarlo per impostare
‫qualsiasi proprietà che vogliamo su di esso.
‫Quindi, di nuovo, solo un oggetto normale.
‫E quindi qui possiamo dire questo. inizio dovrebbe
‫essere la data corrente.
‫Bene?
‫E quindi questo lo
‫imposterà come l'ora corrente in millisecondi, ok?
‫E quindi, qui, nel middleware post, che verrà
‫eseguito dopo l'esecuzione della query, possiamo
‫sottrarre l'ora corrente meno l'ora
‫di inizio.
‫Quindi consolati. log, query
‫presa e ora
‫la data corrente meno
‫questa.
‫inizio, millisecondi.
‫Ok, salviamolo, quindi proviamo
‫a eseguire una query e vedere i nostri risultati.
‫Bene?
‫Quindi, qui abbiamo tutti i nostri
‫tour, qui abbiamo
‫la console, e chiariamolo.
‫C'è un sacco di roba lì dentro.
‫Richiedi di nuovo,
‫e quindi ecco tutti i risultati.
‫Quindi in pratica questi sono tutti i tour che sono stati trovati,
‫e questo è il risultato di console. log dei documenti.
‫Quindi fondamentalmente i documenti che corrispondevano alla query.
‫Ma ora sono interessato a questa prima console. log, e quindi,
‫qui vediamo "La query ha impiegato 120 millisecondi", quindi questo
‫era fondamentalmente il tempo trascorso
‫dall'inizio, in cui l'abbiamo definito, a
‫dopo che la query è stata eseguita, in questo momento.
‫Tutto bene.
‫E questo è tutto ciò che dovevo
‫mostrarti per ora sul middleware
‫di query, e proprio
‫come prima, ovviamente lo useremo
‫molto durante
‫il corso, perché, come ho detto all'inizio,
‫il middleware è davvero un concetto fondamentale questo
‫è davvero importante per molte cose di
‫cui abbiamo bisogno nelle nostre applicazioni.
‫Quindi abbiamo quasi finito di parlare di middleware.
‫Il prossimo è l'ultimo, che è
‫il middleware di aggregazione.