Streams
Clase 25 de 31 • Curso de Fundamentos de Node.js
Resumen
¿Qué son los streams en Node.js y por qué son útiles?
Los streams en Node.js son un concepto fundamental que todos los desarrolladores deberían entender. Aunque al principio pueda parecer complicado, entender cómo funcionan estos flujos de datos te permitirá manejar grandes cantidades de información de manera eficiente, sin saturar la memoria de tu sistema. Pero ¿qué hace que los streams sean tan especiales?
- Tipos de Streams en Node.js:
- Streams de Lectura: Permiten leer datos de una fuente.
- Streams de Escritura: Usados para escribir datos hacia un destino.
- Streams de Doble Sentido: Permiten leer y escribir datos.
Imagina tener un archivo enorme que deseas procesar poco a poco, en lugar de leer todo el archivo de una sola vez. Ahí es donde los streams de lectura entran en juego, permitiéndote gestionar fragmentos de información que llegan en forma de 'paquetes'.
¿Cómo trabajar con streams de lectura?
Vamos a aprender a utilizar los streams de lectura mediante un ejemplo práctico. En lugar de procesar un archivo completo en un solo paso, vamos a manejarlos en piezas más pequeñas para usar menos memoria.
const fs = require('fs');
let data = '';
const readerStream = fs.createReadStream('input.txt');
readerStream.setEncoding('UTF8');
readerStream.on('data', function(chunk) {
data += chunk;
});
readerStream.on('end', function() {
console.log(data);
});
readerStream.on('error', function(err) {
console.log(err.stack);
});
- Crear un stream de lectura: Usamos
fs.createReadStream
. - Escuchar eventos: Responder a la llegada de datos, finalizar la lectura y manejar errores.
- Procesar los datos por paquetes: Acumulamos los datos leídos en trozos, típicamente para manejar archivos grandes.
¿Cómo escribir datos usando streams?
Además de la lectura, Node.js te permite escribir datos usando streams. Esto es particularmente útil cuando quieres enviar datos a un destino, como otro archivo.
const fs = require('fs');
const writeData = 'Escribiendo datos en un archivo utilizando Stream de Escritura.\n';
const writerStream = fs.createWriteStream('output.txt');
writerStream.write(writeData, 'UTF8');
writerStream.end();
writerStream.on('finish', function() {
console.log("Escritura completada.");
});
writerStream.on('error', function(err) {
console.log(err.stack);
});
- Crear un stream de escritura: Con
fs.createWriteStream
. - Escribir y finalizar: Usamos
stream.write
para escribir ystream.end
para terminar. - Manejo de eventos: Detectamos cuando la escritura finaliza o si ocurre algún error.
¿Cómo transformar datos en streams?
A menudo, es necesario transformar datos mientras fluyen de una fuente a un destino. Utiliza streams de transformación para aplicar operaciones de ajuste, como cambiar mayúsculas o filtrar datos.
const { Transform } = require('stream');
class UpperCaseTransform extends Transform {
_transform(chunk, encoding, callback) {
this.push(chunk.toString().toUpperCase());
callback();
}
}
const upperCaseTransform = new UpperCaseTransform();
// Piping data through the transform stream
readerStream.pipe(upperCaseTransform).pipe(process.stdout);
- Crear streams de transformación: Extiende la clase
Transform
y redefine el método_transform
. - Uso de transformaciones: Pipear datos a través de estos streams para modificarlos antes de dirigirlos a su destino final.
Como podemos ver, los streams de Node.js son ideales para la gestión eficiente de grandes cantidades de datos. Empieza a experimentar, integra estos conceptos en tus proyectos y observa cómo mejoran tu eficiencia y claridad en el manejo de datos a gran escala. Continúa aprendiendo, explorando y desarrollando habilidades que te beneficiarán en el desarrollo backend con Node.js.