Node.js y ExpressNode.js CoreLección 3 de 20
Streams y Buffers
Los Streams permiten procesar datos en trozos (chunks) en lugar de cargarlos todos en memoria. Son fundamentales para manejar archivos grandes, respuestas HTTP, y datos en tiempo real. Hay 4 tipos: Readable (leer), Writable (escribir), Duplex (ambos) y Transform (transforma mientras pasa).
const fs = require('fs');
const { Transform } = require('stream');
// ❌ Esto carga 1GB completo en RAM
// const data = fs.readFileSync('archivo-1gb.csv');
// ✅ Stream: procesa chunk por chunk, usa ~64KB de RAM
const readable = fs.createReadStream('archivo-1gb.csv', {
encoding: 'utf8',
highWaterMark: 64 * 1024 // tamaño del chunk: 64KB
});
const writable = fs.createWriteStream('procesado.csv');
// Transform stream personalizado
const mayusculas = new Transform({
transform(chunk, encoding, callback) {
// Transforma cada chunk y lo pasa adelante
this.push(chunk.toString().toUpperCase());
callback();
}
});
// pipe() conecta streams en cadena
// lee → transforma → escribe
readable
.pipe(mayusculas)
.pipe(writable);
writable.on('finish', () => console.log('¡Procesado sin explotar la RAM!'));
readable.on('error', (err) => console.error('Error de lectura:', err));
// Buffer: secuencia de bytes
const buf = Buffer.from('Hola Node', 'utf8');
console.log(buf); // <Buffer 48 6f 6c 61 ...>
console.log(buf.toString()); // 'Hola Node'
console.log(buf.length); // bytes, no caracteres
Consejopipe() maneja automáticamente la contrapresión (backpressure): si el writable es más lento que el readable, pausa el readable para no saturar la memoria. Siempre prefiere pipe() sobre manejar eventos manualmente.
Practica esta lección
Resuelve los ejercicios del curso de Node.js y Express en la app, gratis y con corrección automática.
Empezar a practicar