Los flujos en Node.js son una forma poderosa de manejar la lectura y escritura de datos de manera continua. Le permiten procesar datos de manera eficiente, especialmente cuando se trata de grandes cantidades de información u operaciones de E/S. Esta guía cubrirá los tipos de transmisiones, cómo usarlas y ejemplos prácticos para ayudarlo a comprender cómo funcionan las transmisiones en Node.js.
Los flujos son objetos que le permiten leer datos de un origen o escribir datos en un destino de manera continua. Son ideales para procesar datos pieza por pieza en lugar de leer o escribir archivos o buffers completos a la vez. Esto es especialmente útil cuando se trabaja con grandes conjuntos de datos, ya que puede reducir significativamente el uso de memoria.
Transmisiones legibles: Estas transmisiones le permiten leer datos. Los ejemplos incluyen fs.createReadStream() y http.IncomingMessage.
Secuencias grabables: Estas secuencias le permiten escribir datos. Los ejemplos incluyen fs.createWriteStream() y http.ServerResponse.
Transmisiones dúplex: estas transmisiones pueden leer y escribir datos. Los ejemplos incluyen sockets TCP y net.Duplex.
Transform Streams: son un tipo de flujo dúplex que puede modificar los datos a medida que se leen o escriben. Los ejemplos incluyen zlib.createGzip() para compresión.
Puedes crear una transmisión legible usando el módulo fs incorporado para leer archivos o usando stream.Readable para crear transmisiones legibles personalizadas.
const fs = require('fs'); // Create a readable stream const readableStream = fs.createReadStream('example.txt', { encoding: 'utf8' }); // Handling the 'data' event readableStream.on('data', (chunk) => { console.log('New chunk received:', chunk); }); // Handling the 'end' event readableStream.on('end', () => { console.log('No more data to read.'); });
const { Readable } = require('stream'); class MyReadableStream extends Readable { constructor(options) { super(options); this.current = 0; } _read(size) { if (this.current { console.log('Received:', chunk.toString()); });
Puedes crear transmisiones grabables usando el módulo fs o extendiendo la clase stream.Writable.
const fs = require('fs'); // Create a writable stream const writableStream = fs.createWriteStream('output.txt'); // Write data to the stream writableStream.write('Hello, World!\n'); writableStream.write('Writing to a file using streams.\n'); // End the stream writableStream.end(() => { console.log('Finished writing to file.'); });
const { Writable } = require('stream'); class MyWritableStream extends Writable { _write(chunk, encoding, callback) { console.log('Writing:', chunk.toString()); callback(); // Call when done } } const myWritableStream = new MyWritableStream(); myWritableStream.write('Hello, World!\n'); myWritableStream.write('Writing to custom writable stream.\n'); myWritableStream.end();
Las transmisiones dúplex pueden leer y escribir datos simultáneamente. Un caso de uso común son los sockets TCP.
const { Duplex } = require('stream'); class MyDuplexStream extends Duplex { _read(size) { this.push('Data from duplex stream\n'); this.push(null); // No more data } _write(chunk, encoding, callback) { console.log('Received:', chunk.toString()); callback(); } } const myDuplexStream = new MyDuplexStream(); myDuplexStream.on('data', (chunk) => { console.log('Reading:', chunk.toString()); }); // Write to the duplex stream myDuplexStream.write('Hello, Duplex!\n'); myDuplexStream.end();
Las secuencias de transformación son útiles para modificar los datos a medida que fluyen a través de la secuencia. Por ejemplo, podrías usar una secuencia de transformación para comprimir datos.
const { Transform } = require('stream'); class MyTransformStream extends Transform { _transform(chunk, encoding, callback) { const upperChunk = chunk.toString().toUpperCase(); this.push(upperChunk); callback(); } } const myTransformStream = new MyTransformStream(); myTransformStream.on('data', (chunk) => { console.log('Transformed:', chunk.toString()); }); // Pipe data through the transform stream process.stdin.pipe(myTransformStream).pipe(process.stdout);
Una de las poderosas características de las transmisiones es la capacidad de canalizarlas juntas. La tubería le permite conectar una secuencia legible a una secuencia grabable, lo que facilita la transferencia de datos.
const fs = require('fs'); // Create a readable stream const readableStream = fs.createReadStream('input.txt'); // Create a writable stream const writableStream = fs.createWriteStream('output.txt'); // Pipe the readable stream to the writable stream readableStream.pipe(writableStream); writableStream.on('finish', () => { console.log('Data has been written to output.txt'); });
Las transmisiones legibles emiten varios eventos importantes que te ayudan a administrar el flujo de datos:
const fs = require('fs'); const readableStream = fs.createReadStream('example.txt'); readableStream.on('data', (chunk) => { console.log('Received chunk:', chunk.toString()); }); readableStream.on('end', () => { console.log('No more data to read.'); }); readableStream.on('error', (err) => { console.error('Error occurred:', err); }); readableStream.on('close', () => { console.log('Stream closed.'); });
Las secuencias de escritura también emiten varios eventos:
const fs = require('fs'); const writableStream = fs.createWriteStream('output.txt'); writableStream.on('finish', () => { console.log('All data has been written to output.txt'); }); writableStream.on('error', (err) => { console.error('Error occurred:', err); }); // Writing data writableStream.write('Hello, World!\n'); writableStream.write('Writing to a file using streams.\n'); writableStream.end(); // Call end to finish the writing process
Las secuencias de transformación heredan eventos de secuencias legibles y escribibles, y emiten:
const { Transform } = require('stream'); class MyTransformStream extends Transform { _transform(chunk, encoding, callback) { const upperChunk = chunk.toString().toUpperCase(); this.push(upperChunk); callback(); } } const myTransformStream = new MyTransformStream(); myTransformStream.on('data', (chunk) => { console.log('Transformed chunk:', chunk.toString()); }); myTransformStream.on('end', () => { console.log('No more data to transform.'); }); myTransformStream.on('error', (err) => { console.error('Error occurred:', err); }); // Write data to the transform stream myTransformStream.write('Hello, World!\n'); myTransformStream.write('Transforming this text.\n'); myTransformStream.end(); // End the stream
Los flujos en Node.js proporcionan una forma poderosa y eficiente de manejar datos de manera continua. Le permiten leer y escribir datos pieza por pieza, lo que los hace particularmente útiles para operaciones de E/S y trabajar con grandes conjuntos de datos. Comprender cómo crear y utilizar diferentes tipos de transmisiones, así como también cómo manejar eventos, lo ayudará a crear aplicaciones más eficientes y escalables en Node.js.
Ya sea que esté creando transmisiones legibles, escribibles, dúplex o transformadas, la flexibilidad de la API de transmisión le permite manejar el procesamiento de datos de la manera que mejor se adapte a las necesidades de su aplicación.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3