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.txtamb 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.txtutilitzant un readable stream i l'escrigui en un nou fitxer anomenatoutput.txtutilitzant 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
