Introduzione a NodeJs

nodejs
javascript
server
Introduzione a NodeJs cover image

Introduzione

Quando si cerca di conoscere il web

sviluppo, di solito troviamo che il front-end è significativamente più accessibile del back-end. Ci sono molte ragioni per questo, in particolare la sensazione di feedback immediato che deriva dalla modifica di un determinato elemento di una pagina nel codice e dal notare la modifica applicata al sito web. Questo feedback è spesso utile per i principianti, perché consente loro di modificare il codice e imparare dai propri errori. Sfortunatamente, non è il caso del backend: spesso, una notevole quantità di lavoro è dedicata alla configurazione anticipata dell'ambiente e all'installazione delle dipendenze necessarie per far apparire sul terminale un semplice messaggio "Hello World"., vengono costantemente compiuti molti progressi nella comunità open source per facilitare il processo di sviluppo dei framework e il miglioramento dell'esperienza dello sviluppatore ne è un buon esempio. Questo framework è una tecnologia molto capace che rende la scrittura lato server codice in Javascript conveniente e offre una varietà di strumenti e funzionalità integrati che lo differenziano dai suoi concorrenti. In questo articolo esploreremo NodeJs e il suo ecosistema, con un approccio pratico, costruendo un progetto completamente funzionale.

Cosa costruiremo?

Le applicazioni ToDo sono un progetto di riferimento per i principianti che imparano lo sviluppo front-end. Questo è il motivo per cui abbiamo deciso di creare un'API per l'elenco delle cose da fare. Ciò ci consentirà di aggiungere la persistenza dei dati alla nostra interfaccia e ci darà la possibilità di manipolare questi dati (aggiungendo, aggiornando, eliminando cose da fare, ecc….).

Il codice finale può essere trovato qui.

I nostri strumenti

Utilizzeremo uno stack tecnologico semplificato per questo progetto. Può essere considerato come una versione minima di molti strumenti che troverai nei progetti della vita reale, poiché le idee di livello superiore sono le stesse. I dettagli di implementazione e la scelta di uno strumento specifico rispetto a un altro non sono importanti per iniziare.

  • NodeJs, come abbiamo accennato, è uno dei framework Javascript più popolari per la creazione di applicazioni lato server.

  • ExpressJs è un framework Javascript minimo utilizzato su NodeJS. Accelera il processo di sviluppo utilizzando molte funzionalità integrate. Viene anche utilizzato come modo per standardizzare le pratiche di sviluppo nei progetti NodeJS al fine di facilitarne l'utilizzo per gli ingegneri.

  • LowDB è un semplice database in memoria. La sua semplicità ci consente di mostrare come interagire con un database in un progetto NodeJs, senza affrontare argomenti più avanzati come implementazioni e configurazioni.

Ora che abbiamo identificato tutti gli strumenti che utilizzeremo, prendiamo le nostre tastiere e iniziamo a programmare!

Installazione

Node è disponibile su tutte le piattaforme. Tutte le guide di installazione possono essere trovate sul sito ufficiale. Gli utenti Windows dovrebbero assicurarsi di aggiungere il nodo percorso alle variabili di ambiente in modo che possa essere utilizzato sulla riga di comando.

Avremo bisogno anche di npm installato. Npm è il gestore di pacchetti standard per NodeJs. Ci consentirà di gestire le dipendenze del nostro progetto. La guida all'installazione può essere trovata qui.

Inizializzazione del progetto

Vai al collegamento e clona il progetto iniziale:

Questo è un semplice repository di partenza per il nostro progetto. Contiene tutte le dipendenze che utilizzeremo insieme alla struttura del file di progetto. Spiegheremo ogni elemento una volta raggiunto. Apri il terminale, vai al percorso del progetto ed esegui il comando:

npm install

Questo installerà tutte le dipendenze del progetto specificato nel file package.json. package.json è il file che si trova alla radice di qualsiasi progetto Javascript/NodeJs, contiene metadati su quest'ultimo e viene utilizzato per gestire tutte le dipendenze, gli script e le versioni del progetto.

Dopo aver installato tutte le dipendenze, possiamo avviare la nostra applicazione:

npm run start

"start" è uno script che abbiamo specificato nel pacchetto. json. Specifica il file di ingresso della nostra applicazione, che nel nostro caso è app.js.

Il seguente messaggio dovrebbe ora apparire nel tuo terminale:

nodejs_1

Ciò significa che il nostro server è stato avviato correttamente ed è in ascolto per eventuali richieste inviate alla porta 3000. Diamo un'occhiata ad app.js e spieghiamo cosa sta succedendo qui:

nodejs_2

App.js è il file di ingresso del nostro progetto (e l'unico a questo punto). Istanziamo un'applicazione espressa denominata app, specifichiamo che tutte le richieste che hanno il metodo http "GET" e il sottopercorso '/' saranno gestite da questo percorso, passiamo una funzione chiamata middleware, che accetta la richiesta e l'oggetto risposta come parametri. Questo è fondamentale, poiché la richiesta contiene tutte le informazioni necessarie per essere gestita (parametri, corpo della richiesta, intestazioni della richiesta, ecc.) e l'oggetto risposta è quello che verrà restituito al client. Iniziamo semplicemente inviando il messaggio "Hello world". Successivamente facciamo in modo che la nostra applicazione ascolti eventuali richieste in entrata sulla porta specificata (nel nostro caso 3000) e registriamo il messaggio "Ascolto sulla porta 3000" per indicare che la nostra applicazione è attiva e funzionante e pronta a ricevere richieste.

Apri il tuo terminale e nella barra dei collegamenti digita "localhost:3000/" e premi Invio. Questo è il percorso specificato che possiamo utilizzare per raggiungere il nostro server localmente. Riceverai il seguente messaggio:

nodejs_3

Configurazione del database

Lowdb è un database open source facile da usare e non richiede alcuna configurazione specifica. L'idea generale alla base è quella di archiviare tutti i dati in un file json locale. Dopo aver installato LowDB (cosa che è stata fatta quando abbiamo installato tutte le dipendenze), possiamo aggiungere il seguente codice a db.js:

nodejs_4

Questo codice è abbastanza simile a quello trovato nella documentazione ufficiale di LowDB. L'abbiamo leggermente modificato per il nostro caso d'uso. Spieghiamolo riga per riga:

Le prime righe servono per importare le dipendenze necessarie. “join” è una funzione di utilità disponibile nel modulo “path”. È uno dei moduli principali di NodeJs che offre molti metodi per gestire e gestire i percorsi. "Low" e "JSONFile" sono le due classi esposte da LowDB. Il primo crea l'istanza del file json che conterrà i nostri dati. Il secondo crea l'effettiva istanza del database che agirà su di essa. Infine, “lodash” è una delle librerie javascript più utilizzate che offre un’ampia varietà di funzioni di utilità per attività di programmazione comuni. Lo aggiungiamo alla nostra istanza del database per consentirci di utilizzare i suoi metodi avanzati per gestire i nostri dati.

Innanzitutto specifichiamo il percorso per il file db.json. È il file che conterrà i nostri dati e verrà passato a LowDB. Se il file non viene trovato nel percorso specificato, LowDB ne creerà uno.

Passiamo quindi il percorso del file all'adattatore LowDB e lo passiamo alla nostra nuova istanza del database LowDB. La variabile “db” può quindi essere utilizzata per comunicare con il nostro database. Una volta creata l'istanza del database, leggiamo dal file json utilizzando db.read(). Ciò imposterà il campo "dati" nella nostra istanza del database in modo da poter accedere al contenuto del database. Nota che abbiamo preceduto questa riga con "await". Questo per specificare che questa istruzione potrebbe richiedere un tempo sconosciuto per essere risolta e che il processo NodeJs deve attendere la sua esecuzione prima di procedere con il resto del codice. Lo facciamo perché l'operazione di lettura richiede l'accesso alla memoria del file specificato e il tempo per eseguire questo tipo di operazione dipende dalle specifiche della macchina.

Ora che abbiamo accesso al campo dati, lo impostiamo come oggetto contenente un array vuoto di post, ovvero controlliamo se il file contiene dati precedenti e impostiamo l'array vuoto in caso contrario.

Infine, eseguiamo db.write() per applicare le modifiche apportate ai dati ed esportiamo l'istanza del database in modo che possa essere utilizzata in altri file nel nostro progetto.

Flusso di lavoro di richiesta/risposta generale

Considera il seguente diagramma:

nodejs_5

Mostra l'architettura generale applicata in una pletora di applicazioni backend realizzate con NodeJs/Express. Comprendere il flusso di lavoro generale dietro la gestione di una richiesta non solo ti consentirà di creare e strutturare applicazioni NodeJs, ma ti consentirà anche di trasferire questi concetti praticamente in qualsiasi stack tecnico di tua scelta. Esploreremo i diversi livelli che interferiscono con questo processo e spiegheremo i loro ruoli:

## Livello richiesta HTTP

Questo è il primo livello della nostra applicazione, immaginatelo come un gateway che riceve un'ampia gamma di richieste diverse provenienti da diversi client, ogni richiesta viene quindi analizzata e inoltrata alla parte dedicata dell'applicazione per essere gestita.

  • Router: qui ci riferiamo ai router Express, ma questo concetto è presente in molti framework backend. I router sono un modo per applicare la distribuzione logica nella nostra logica aziendale al nostro codice, il che significa che ogni insieme di elementi che condividono caratteristiche simili è gestito dalla stessa voce e può essere separato dal resto dei set. Ciò ha il vantaggio di rendere ogni componente del codice indipendente dagli altri e più facile da mantenere ed estendere. Più specificamente, e ad esempio, tutte le richieste che soddisfano le condizioni del percorso URL condiviso “/posts” saranno gestite dallo stesso router. A seconda del metodo http (GET, POST, ecc.), verrà utilizzato un controller diverso.

  • Controller: un controller riceve richieste filtrate dai router, applica elaborazioni aggiuntive e chiama i metodi di servizio adeguati.

Livello della logica aziendale

Questo livello è univoco a seconda dei casi d'uso specifici dell'applicazione e della logica aziendale alla base.

  • Servizi: i servizi sono un insieme di metodi che contengono la logica principale dell'applicazione. Interagiscono anche con il database attraverso l'uso di ORM/ODM.).

  • Servizi di terze parti: molte applicazioni moderne scelgono di delegare una parte della logica dell'applicazione a servizi dedicati accessibili tramite API. Servizi di questo tipo possono essere servizi di gestione dei pagamenti, archiviazione di file statici, notifiche e altri.

  • ODM/ORM: ORM e ODM fungono da intermediari tra i servizi e il database. Il loro ruolo è fornire un'astrazione di alto livello su un database che consenta allo sviluppatore di scrivere codice nel linguaggio di programmazione di sua scelta anziché in linguaggi di database dedicati, come SQL.

Livello di persistenza dei dati

  • Database: come accennato in precedenza, quasi tutte le applicazioni necessitano di una qualche forma di persistenza dei dati. Questa parte è gestita dai database e, a seconda della natura dei dati, della logica di business e di molte altre considerazioni, la scelta di un determinato database rispetto a un altro è considerata cruciale per l'efficienza e la scalabilità dell'applicazione.

Esempio: aggiunta di un post

Ora che abbiamo compreso l’idea generale alla base dell’architettura, applichiamola al nostro semplice esempio. Implementeremo la funzionalità di aggiunta di un post di cose da fare alla nostra applicazione. Supponiamo che ogni post abbia un ID univoco che ci consentirà di identificarlo successivamente nel nostro database, un titolo che è una stringa e un ordine che è di tipo intero. Seguendo il nostro diagramma, inizieremo implementando il router. Aggiungi il seguente codice al file index.js:

Starting a server in ExpressJS

Questo è il nostro file del router. Importiamo express e il metodo "addPost" dal nostro controller (lo implementeremo a breve), creiamo un'istanza di express router e colleghiamo il metodo addPost al nostro router, il che significa che per ogni richiesta che ha il percorso root e l'http metodo “POST”, verrà chiamato il metodo “addPost” per gestirlo.

Prima di implementare il nostro metodo nel controller, facciamo riferimento al nuovo router nel nostro file app.js principale e specifichiamo il suo percorso come "/posts": tutti i percorsi con i percorsi specificati verranno inoltrati a questo router, in modo che possa essere gestito dai diversi metodi di controllo:

Starting a server in ExpressJS

Importiamo il router e lo chiamiamo "post". app.use(“/posts”,..) significa che tutte le richieste con il sottopercorso “/posts”, indipendentemente dal metodo http, verranno instradate al router specificato.

Altre modifiche ad app.js includono l'importazione del file di configurazione del database affinché possa essere eseguito e l'utilizzo di express.json() come middleware per consentirci di accedere all'oggetto corpo della richiesta.

Ora che i nostri percorsi sono impostati, possiamo aggiungere il metodo “addPost” nel file controller.js:

Starting a server in ExpressJS

“addPost” è una funzione middleware che accetta come parametri la richiesta, gli oggetti risposta e la funzione successiva. Quando viene chiamata la funzione successiva, il processo passerà al middleware successivo nella catena o terminerà la richiesta. Nel codice del metodo estraiamo il titolo e l'ordine dal corpo della richiesta e li passiamo come parametri alla funzione di servizio “createPost”. Questa funzione prende gli attributi del post, crea un nuovo post e lo restituisce. Una volta creato il nuovo post lo restituiamo al cliente insieme al codice di stato 200, a significare che la richiesta è andata a buon fine. Potresti notare che il nostro codice è inserito in un blocco try/catch per rilevare eventuali errori imprevisti e passarli al middleware successivo. È considerata una buona pratica collegare a tutti i router un middleware di gestione degli errori che estrae l'errore e restituisce un messaggio di errore significativo al client.

Ora non resta che implementare la funzione “createPost” in service.js:

nodejs_6

Come accennato in precedenza spiegando i diversi livelli dell'architettura, il livello di servizio interagisce con la soluzione di archiviazione dei dati attraverso l'uso di ORM/ODM. Tuttavia, nel nostro esempio, non avremo bisogno di utilizzare un ORM separato, poiché Lowdb è dotato di supporto integrato per Javascript. Tutti i dettagli sulla sua sintassi possono essere trovati nella documentazione.

Il metodo "createPost" riceve titolo e ordine come parametri e li utilizza per creare l'oggetto post. Per l'id univoco utilizziamo una libreria dedicata chiamata “nanoide”, che genera una sequenza unica di caratteri. Aggiungiamo il nuovo post nell'array posts nel database e scriviamo queste modifiche; il nuovo post viene quindi restituito dalla funzione.

Ora che "createPost" è pronto, la funzionalità di aggiunta dei post è terminata e operativa. Lo testiamo utilizzando Postman, uno strumento popolare per testare le API:

nodejs_7

Selezioniamo "POST" come metodo http per la richiesta insieme al percorso URL specificato "localhost:3000/posts". Aggiungiamo il titolo e l'ordine in formato json nella sezione body e inviamo la richiesta. Come mostrato sopra, riceviamo lo stato 200 OK insieme al post appena creato.

Conclusione

In questo progetto sono stati esplorati molti concetti e idee: abbiamo spiegato come installare e configurare il nostro ambiente di progetto, imparato come configurare LowDB per la persistenza dei dati locali, esplorato l'architettura generale delle applicazioni backend NodeJS/Express e visto come applicalo in un semplice esempio. Infine, abbiamo testato la nostra applicazione utilizzando Postman.

L'intento qui era quello di esporre una versione semplificata di tutto ciò che riguarda la creazione di moderne applicazioni backend. Come abbiamo visto in precedenza, NodeJs è un potente strumento che ci consente di creare API semplici e complesse. In combinazione con il suo ricco ecosistema di framework, come Express e una miriade di strumenti e librerie per quasi tutti i casi d'uso, è una soluzione legittima per lo sviluppo backend moderno, una soluzione che consigliamo di apprendere e padroneggiare.


Career Services background pattern

Servizi per le carriere

Contact Section background image

Rimaniamo in contatto

Code Labs Academy © 2024 Tutti i diritti riservati.