En aquest tema, aprendrem sobre els streams en Node.js, una característica poderosa que permet processar dades de manera eficient i escalable. Els streams són una abstracció per treballar amb dades que arriben de manera contínua, com fitxers, xarxes, o qualsevol altra font de dades.
Què són els Streams?
Els streams són objectes que permeten llegir o escriure dades de manera seqüencial. Hi ha quatre tipus principals de streams en Node.js:
- Readable Streams: Streams des dels quals es poden llegir dades.
- Writable Streams: Streams als quals es poden escriure dades.
- Duplex Streams: Streams que són tant llegibles com escrivibles.
- Transform Streams: Streams que poden modificar o transformar les dades mentre passen a través d'ells.
Avantatges dels Streams
- Eficiència de Memòria: Els streams permeten processar dades en trossos petits, evitant la necessitat de carregar tot el contingut a la memòria.
- Rendiment: Els streams poden començar a processar dades immediatament, sense esperar que tot el contingut estigui disponible.
- Escalabilitat: Els streams són ideals per treballar amb grans volums de dades o fonts de dades contínues.
Exemple Pràctic: Llegir un Fitxer amb Streams
A continuació, veurem com llegir un fitxer utilitzant un readable stream.
const fs = require('fs'); // Crear un readable stream const readableStream = fs.createReadStream('example.txt', { encoding: 'utf8', highWaterMark: 16 * 1024 // 16KB }); // Gestionar l'esdeveniment 'data' readableStream.on('data', (chunk) => { console.log('Chunk received:', chunk); }); // Gestionar l'esdeveniment 'end' readableStream.on('end', () => { console.log('No more data.'); }); // Gestionar l'esdeveniment 'error' readableStream.on('error', (err) => { console.error('Error:', err); });
Explicació del Codi
- fs.createReadStream: Crea un readable stream per al fitxer
example.txt
. - encoding: Especifica la codificació del fitxer (en aquest cas,
utf8
). - highWaterMark: Defineix la mida del buffer (en aquest cas, 16KB).
- 'data': Esdeveniment que es dispara quan es rep un tros de dades.
- 'end': Esdeveniment que es dispara quan no hi ha més dades per llegir.
- 'error': Esdeveniment que es dispara si hi ha un error durant la lectura.
Exemple Pràctic: Escriure en un Fitxer amb Streams
Ara veurem com escriure dades en un fitxer utilitzant un writable stream.
const fs = require('fs'); // Crear un writable stream const writableStream = fs.createWriteStream('output.txt'); // Escriure dades al stream writableStream.write('Hello, '); writableStream.write('world!\n'); // Finalitzar el stream writableStream.end(); // Gestionar l'esdeveniment 'finish' writableStream.on('finish', () => { console.log('All data has been written.'); }); // Gestionar l'esdeveniment 'error' writableStream.on('error', (err) => { console.error('Error:', err); });
Explicació del Codi
- fs.createWriteStream: Crea un writable stream per al fitxer
output.txt
. - write: Escriu dades al stream.
- end: Finalitza el stream, indicant que no hi ha més dades per escriure.
- 'finish': Esdeveniment que es dispara quan totes les dades han estat escrites.
- 'error': Esdeveniment que es dispara si hi ha un error durant l'escriptura.
Exercici Pràctic
Exercici 1: Llegir i Escriure Fitxers amb Streams
-
Crea un fitxer anomenat
input.txt
amb el contingut següent:Node.js és una plataforma de programació asíncrona basada en l'event loop.
-
Escriu un programa que llegeixi el contingut de
input.txt
utilitzant un readable stream i l'escrigui en un nou fitxer anomenatoutput.txt
utilitzant un writable stream.
Solució
const fs = require('fs'); // Crear un readable stream const readableStream = fs.createReadStream('input.txt', { encoding: 'utf8', highWaterMark: 16 * 1024 // 16KB }); // Crear un writable stream const writableStream = fs.createWriteStream('output.txt'); // Llegir dades del readable stream i escriure-les al writable stream readableStream.on('data', (chunk) => { writableStream.write(chunk); }); // Finalitzar el writable stream quan el readable stream acaba readableStream.on('end', () => { writableStream.end(); console.log('Data has been copied from input.txt to output.txt'); }); // Gestionar errors readableStream.on('error', (err) => { console.error('Error reading input.txt:', err); }); writableStream.on('error', (err) => { console.error('Error writing to output.txt:', err); });
Conclusió
Els streams són una eina poderosa en Node.js per treballar amb dades de manera eficient i escalable. Hem après a crear i utilitzar readable i writable streams per llegir i escriure fitxers. En el proper tema, explorarem el mòdul del sistema de fitxers en més detall.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu