Skip to content

Introduzione a Node.js

Node.js è un ambiente di runtime JavaScript open-source e multipiattaforma. È uno strumento popolare per quasi ogni tipo di progetto!

Node.js esegue il motore JavaScript V8, il core di Google Chrome, al di fuori del browser. Questo permette a Node.js di essere molto performante.

Un'applicazione Node.js gira in un singolo processo, senza creare un nuovo thread per ogni richiesta. Node.js fornisce un insieme di primitive I/O asincrone nella sua libreria standard che impediscono al codice JavaScript di bloccarsi e, generalmente, le librerie in Node.js sono scritte usando paradigmi non bloccanti, rendendo il comportamento bloccante l'eccezione piuttosto che la norma.

Quando Node.js esegue un'operazione I/O, come la lettura dalla rete, l'accesso a un database o al filesystem, invece di bloccare il thread e sprecare cicli CPU in attesa, Node.js riprenderà le operazioni quando arriva la risposta.

Questo permette a Node.js di gestire migliaia di connessioni concorrenti con un singolo server senza introdurre l'onere di gestire la concorrenza dei thread, che potrebbe essere una significativa fonte di bug.

Node.js ha un vantaggio unico perché milioni di sviluppatori frontend che scrivono JavaScript per il browser sono ora in grado di scrivere il codice lato server oltre al codice lato client senza la necessità di imparare un linguaggio completamente diverso.

In Node.js gli standard ECMAScript più recenti possono essere usati senza problemi, poiché non è necessario attendere che tutti gli utenti aggiornino i loro browser - si è responsabili della decisione di quale versione ECMAScript utilizzare cambiando la versione di Node.js, ed è anche possibile abilitare specifiche funzionalità sperimentali eseguendo Node.js con flag.

Un esempio di applicazione Node.js

L'esempio più comune di "Hello World" di Node.js è un web server:

js
import { createServer } from 'node:http'
const hostname = '127.0.0.1'
const port = 3000
const server = createServer((req, res) => {
  res.statusCode = 200
  res.setHeader('Content-Type', 'text/plain')
  res.end('Hello World')
})
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`)
})

Per eseguire questo frammento di codice, salvarlo come file server.js ed eseguire node server.js nel terminale. Se si utilizza la versione mjs del codice, è necessario salvarlo come file server.mjs ed eseguire node server.mjs nel terminale.

Questo codice include prima il modulo http di Node.js.

Node.js ha una fantastica libreria standard, incluso il supporto di prima classe per il networking.

Il metodo createServer() di http crea un nuovo server HTTP e lo restituisce.

Il server è impostato per ascoltare sulla porta e sul nome host specificati. Quando il server è pronto, viene chiamata la funzione di callback, in questo caso informandoci che il server è in esecuzione.

Ogni volta che viene ricevuta una nuova richiesta, viene chiamato l'evento request, fornendo due oggetti: una richiesta (un oggetto http.IncomingMessage) e una risposta (un oggetto http.ServerResponse).

Questi 2 oggetti sono essenziali per gestire la chiamata HTTP.

Il primo fornisce i dettagli della richiesta. In questo semplice esempio, questo non viene utilizzato, ma è possibile accedere alle intestazioni della richiesta e ai dati della richiesta.

Il secondo viene utilizzato per restituire i dati al chiamante.

In questo caso con:

js
res.setHeader('Content-Type', 'text/plain')

impostiamo la proprietà statusCode a 200, per indicare una risposta di successo.

Impostiamo l'intestazione Content-Type:

js
res.setHeader('Content-Type', 'text/plain')

e chiudiamo la risposta, aggiungendo il contenuto come argomento a end():

js
res.end('Hello World')

Questo invierà la risposta al client.