"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Comprender las transmisiones de Node.js: qué, por qué y cómo usarlas

Comprender las transmisiones de Node.js: qué, por qué y cómo usarlas

Publicado el 2024-11-09
Navegar:138

Understanding Node.js Streams: What, Why, and How to Use Them

Node.js Streams es una característica esencial para manejar grandes cantidades de datos de manera eficiente. A diferencia de los mecanismos tradicionales de entrada y salida, los flujos permiten que los datos se procesen en fragmentos en lugar de cargarlos todos en la memoria, lo que los hace perfectos para manejar archivos grandes o datos en tiempo real. En este artículo, profundizaremos en qué son los flujos de Node.js, por qué son útiles, cómo implementarlos y varios tipos de flujos con ejemplos detallados y casos de uso.

¿Qué son las transmisiones de Node.js?

En términos simples, una secuencia es una secuencia de datos que se mueven de un punto a otro a lo largo del tiempo. Puedes considerarlo como una cinta transportadora donde los datos fluyen pieza por pieza en lugar de todos a la vez.

Las transmisiones de Node.js funcionan de manera similar; le permiten leer y escribir datos en fragmentos (en lugar de todos a la vez), lo que los hace altamente eficientes en memoria.

Las transmisiones en Node.js se crean sobre EventEmitter, lo que las hace basadas en eventos. Algunos eventos importantes incluyen:

  • datos: Emitido cuando los datos están disponibles para el consumo.
  • end: Se emite cuando no hay más datos disponibles para consumir.
  • error: Emitido cuando ocurre un error durante la lectura o escritura.

¿Por qué utilizar transmisiones?

Los flujos ofrecen varias ventajas sobre los métodos tradicionales como fs.readFile() o fs.writeFile() para manejar E/S:

  1. Eficiencia de la memoria: puedes manejar archivos muy grandes sin consumir grandes cantidades de memoria, ya que los datos se procesan en fragmentos.
  2. Rendimiento: Las transmisiones proporcionan E/S sin bloqueo. Permiten leer o escribir datos pieza por pieza sin esperar a que se complete toda la operación, lo que hace que el programa tenga mayor capacidad de respuesta.
  3. Procesamiento de datos en tiempo real: Las transmisiones permiten el procesamiento de datos en tiempo real, como video/audio en vivo o grandes conjuntos de datos desde API.

Tipos de transmisiones en Node.js

Hay cuatro tipos de transmisiones en Node.js:

  1. Transmisiones legibles: para leer datos.
  2. Secuencias grabables: Para escribir datos.
  3. Transmisiones dúplex: transmisiones que pueden leer y escribir datos simultáneamente.
  4. Transformar flujos: un tipo de flujo dúplex donde la salida es una versión modificada de la entrada (por ejemplo, compresión de datos).

Repasemos cada tipo con ejemplos.

1. Secuencias legibles

Las secuencias legibles se utilizan para leer datos fragmento por fragmento. Por ejemplo, al leer un archivo grande, usar una secuencia legible nos permite leer pequeños fragmentos de datos en la memoria en lugar de cargar el archivo completo.

Ejemplo: leer un archivo usando Readable Stream

const fs = require('fs');

// Create a readable stream
const readableStream = fs.createReadStream('largefile.txt', { encoding: 'utf8' });

// Listen for data events and process chunks
readableStream.on('data', (chunk) => {
  console.log('Chunk received:', chunk);
});

// Listen for the end event when no more data is available
readableStream.on('end', () => {
  console.log('No more data.');
});

// Handle error event
readableStream.on('error', (err) => {
  console.error('Error reading the file:', err);
});

Explicación:

  • fs.createReadStream() crea una secuencia para leer el archivo en fragmentos.
  • El evento de datos se activa cada vez que un fragmento está listo y el evento de finalización se activa cuando no hay más datos para leer.

2. Secuencias grabables

Las secuencias de escritura se utilizan para escribir datos fragmento por fragmento. En lugar de escribir todos los datos a la vez, puedes transmitirlos a un archivo u otro destino grabable.

Ejemplo: escritura de datos mediante secuencia grabable

const fs = require('fs');

// Create a writable stream
const writableStream = fs.createWriteStream('output.txt');

// Write chunks to the writable stream
writableStream.write('Hello, World!\n');
writableStream.write('Streaming data...\n');

// End the stream (important to avoid hanging the process)
writableStream.end('Done writing.\n');

// Listen for the finish event
writableStream.on('finish', () => {
  console.log('Data has been written to output.txt');
});

// Handle error event
writableStream.on('error', (err) => {
  console.error('Error writing to the file:', err);
});

Explicación:

  • fs.createWriteStream() crea una secuencia grabable.
  • Los datos se escriben en la secuencia utilizando el método write().
  • El evento de finalización se activa cuando se escriben todos los datos y el método end() marca el final de la transmisión.

3. Flujos dúplex

Las transmisiones dúplex pueden leer y escribir datos. Un ejemplo típico de transmisión dúplex es un socket de red, donde puedes enviar y recibir datos simultáneamente.

Ejemplo: transmisión dúplex

const { Duplex } = require('stream');

const duplexStream = new Duplex({
  write(chunk, encoding, callback) {
    console.log(`Writing: ${chunk.toString()}`);
    callback();
  },
  read(size) {
    this.push('More data');
    this.push(null);  // End the stream
  }
});

// Write to the duplex stream
duplexStream.write('Hello Duplex!\n');

// Read from the duplex stream
duplexStream.on('data', (chunk) => {
  console.log(`Read: ${chunk}`);
});

Explicación:

  • Definimos un método de escritura para escribir y un método de lectura para lectura.
  • Las transmisiones dúplex pueden manejar lectura y escritura simultáneamente.

4. Transformar corrientes

Las secuencias de transformación modifican los datos a medida que pasan por la secuencia. Por ejemplo, un flujo de transformación podría comprimir, cifrar o manipular datos.

Ejemplo: Transformar secuencia (texto en mayúsculas)

const { Transform } = require('stream');

// Create a transform stream that converts data to uppercase
const transformStream = new Transform({
  transform(chunk, encoding, callback) {
    this.push(chunk.toString().toUpperCase());
    callback();
  }
});

// Pipe input to transform stream and then output the result
process.stdin.pipe(transformStream).pipe(process.stdout);

Explicación:

  • La entrada de datos desde stdin se transforma a mayúsculas mediante el método de transformación y luego se envía a stdout.

Corrientes de tuberías

Una de las características clave de las transmisiones de Node.js es su capacidad de ser canalizada. La tubería le permite encadenar transmisiones, pasando la salida de una transmisión como entrada a otra.

Ejemplo: canalizar una secuencia legible a una secuencia grabable

const fs = require('fs');

// Create a readable stream for the input file
const readableStream = fs.createReadStream('input.txt');

// Create a writable stream for the output file
const writableStream = fs.createWriteStream('output.txt');

// Pipe the readable stream into the writable stream
readableStream.pipe(writableStream);

// Handle errors
readableStream.on('error', (err) => console.error('Read error:', err));
writableStream.on('error', (err) => console.error('Write error:', err));

Explicación:

  • El método pipe() conecta la secuencia legible con la secuencia grabable, enviando fragmentos de datos directamente desde input.txt a output.txt.

Casos de uso prácticos de Node.js Streams

  1. Lectura y escritura de archivos grandes: en lugar de leer un archivo completo en la memoria, las secuencias le permiten procesar el archivo en pequeños fragmentos.
  2. Procesamiento de datos en tiempo real: Las transmisiones son ideales para aplicaciones en tiempo real, como procesamiento de audio/video, aplicaciones de chat o transmisiones de datos en vivo.
  3. Solicitudes/Respuestas HTTP: Las solicitudes y respuestas HTTP en Node.js son flujos, lo que facilita el procesamiento de datos entrantes o el envío de datos progresivamente.

Conclusión

Los flujos de Node.js proporcionan una forma poderosa y eficiente de manejar operaciones de E/S al trabajar con datos en fragmentos. Ya sea que esté leyendo archivos grandes, canalizando datos entre fuentes o transformando datos sobre la marcha, los flujos ofrecen una solución eficaz y eficiente en memoria. Comprender cómo aprovechar los flujos de lectura, escritura, dúplex y transformación en su aplicación puede mejorar significativamente el rendimiento y la escalabilidad de su aplicación.

Declaración de liberación Este artículo se reproduce en: https://dev.to/imsushant12/understanding-nodejs-streams-what-why-and-how-to-use-them-53da?1 Si hay alguna infracción, comuníquese con Study_golang@163 .com para eliminarlo
Último tutorial Más>

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