Immagina di dover leggere un file video di 5 GB per processarlo. Se provassi a caricarlo interamente in memoria, la tua applicazione andrebbe in crash per "out of memory". La soluzione a questo problema in Node.js sono gli Streams.
Un concetto simile a quello dei Generatori in PHP, gli streams sono uno dei concetti fondamentali di Node.js. Permettono di leggere o scrivere dati in piccoli "pezzi" (chunk) sequenziali, invece di gestire l'intero set di dati in una volta sola.
I 4 Tipi di Stream
L'API degli streams di Node.js definisce quattro tipi principali:
- Readable Streams: Sorgenti da cui i dati possono essere letti (es. leggere un file, ricevere una richiesta HTTP).
- Writable Streams: Destinazioni in cui i dati possono essere scritti (es. scrivere su un file, inviare una risposta HTTP).
- Duplex Streams: Stream che sono sia leggibili che scrivibili (es. un socket di rete).
- Transform Streams: Stream duplex speciali che possono modificare i dati mentre passano attraverso di essi (es. comprimere o cifrare i dati al volo).
L'Importanza della `pipe()`
La vera magia degli streams risiede nel metodo `.pipe()`. Questo metodo prende l'output di un Readable Stream e lo "incanala" direttamente nell'input di un Writable Stream. Node.js si occupa di gestire automaticamente il flusso dei dati, la pressione (back-pressure) e la memoria.
Esempio Pratico: Comprimere un File di Grandi Dimensioni
Questo codice legge un file `grande.txt`, lo comprime usando lo stream di `zlib` e lo scrive in un nuovo file `grande.txt.gz`, il tutto con un consumo di memoria minimo.
const fs = require('fs');
const zlib = require('zlib');
const readableStream = fs.createReadStream('grande.txt');
const writableStream = fs.createWriteStream('grande.txt.gz');
const gzipStream = zlib.createGzip();
// Incanala i dati: Lettura -> Compressione -> Scrittura
readableStream.pipe(gzipStream).pipe(writableStream);
console.log("Compressione avviata...");
Saper usare gli streams è una competenza fondamentale per scrivere applicazioni Node.js performanti e scalabili, specialmente quando si lavora con file di grandi dimensioni o con lo streaming di dati in tempo reale, come in una chat basata su WebSockets.
Hai bisogno di una soluzione su misura?
Dalla Web App al gestionale custom, trasformiamo le tue idee in software performante. Contattaci per una consulenza gratuita.
Richiedi una consulenza