Tutorial de Node js Streams: Filestream, Pipes

En este tutorial, aprenderá

  • Flujo de archivos en Node.js
  • Tuberías en Node.js
  • Eventos en Node.js
  • Emisión de eventos

Flujo de archivos en Node.js

Node hace un uso extensivo de flujos como mecanismo de transferencia de datos.

Por ejemplo, cuando envía algo a la consola usando la función console.log, en realidad está usando una secuencia para enviar los datos a la consola.

Node.js también tiene la capacidad de transmitir datos desde archivos para que puedan leerse y escribirse correctamente. Ahora veremos un ejemplo de cómo podemos usar secuencias para leer y escribir desde archivos. Necesitamos seguir los pasos que se mencionan a continuación para este ejemplo

Paso 1) Cree un archivo llamado data.txt que tenga los siguientes datos. Supongamos que este archivo está almacenado en la unidad D de nuestra máquina local.

Tutorial sobre Node.js

Introducción

Eventos

Generadores

Conectividad de datos

Usando Jasmine

Paso 2) Escriba el código relevante que utilizará secuencias para leer datos del archivo.

var fs = require("fs");var stream;stream = fs.createReadStream("D://data.txt");stream.on("data", function(data) {var chunk = data.toString();console.log(chunk);});

Explicación del código: -

  1. Primero necesitamos incluir los módulos 'fs' que contienen toda la funcionalidad requerida para crear flujos.
  2. A continuación, creamos una secuencia legible utilizando el método - createReadStream. Como entrada, damos la ubicación de nuestro archivo data.txt.
  3. La función steam.on es un controlador de eventos y en él, estamos especificando el primer parámetro como 'datos'. Esto significa que siempre que los datos lleguen a la secuencia desde el archivo, ejecute una función de devolución de llamada. En nuestro caso, estamos definiendo una función callback que realizará 2 pasos básicos. La primera es convertir los datos leídos del archivo como una cadena. El segundo sería enviar la cadena convertida como salida a la consola.
  4. Tomamos cada fragmento de datos que se lee del flujo de datos y lo convertimos en una cadena.
  5. Finalmente, estamos enviando la salida de cada fragmento convertido de cadena a la consola.

Producción:

  • Si el código se ejecuta correctamente, verá el resultado anterior en la consola. Esta salida será la misma que la del archivo data.txt.

Escribir en un archivo

De la misma manera que creamos un flujo de lectura, también podemos crear un flujo de escritura para escribir datos en un archivo. Primero creemos un archivo vacío sin contenido llamado data.txt. Supongamos que este archivo se coloca en la unidad D de nuestra computadora.

El siguiente código muestra cómo podemos escribir datos en el archivo.

var fs = require("fs");var stream;stream = fs.createWriteStream("D://data.txt");stream.write("Tutorial on Node.js")stream.write("Introduction")stream.write("Events")stream.write("Generators")stream.write("Data Connectivity")stream.write("Using Jasmine")

Explicación del código: -

  1. Estamos creando una secuencia de escritura usando el método - createWriteStream. Como entrada, damos la ubicación de nuestro archivo data.txt.
  2. A continuación, usamos el método stream.write para escribir las diferentes líneas de texto en nuestro archivo de texto. La secuencia se encargará de escribir estos datos en el archivo data.txt.

Si abre el archivo data.txt, ahora verá los siguientes datos en el archivo

Tutorial sobre Node.js

Introducción

Eventos

Generadores

Conectividad de datos

Usando Jasmine

Tuberías en Node.js

Dentro de las aplicaciones de Node, las transmisiones se pueden unir usando el método pipe (), que toma dos argumentos:

  • Un flujo de escritura obligatorio que actúa como destino de los datos y
  • Un objeto opcional que se usa para pasar opciones.

Un ejemplo típico de uso de canalizaciones, si desea transferir datos de un archivo a otro.

Entonces, veamos un ejemplo de cómo podemos transferir datos de un archivo a otro usando tuberías.

Paso 1) Cree un archivo llamado datainput.txt que tiene los siguientes datos. Supongamos que este archivo está almacenado en la unidad D de nuestra máquina local.

Tutorial sobre Node.js

Introducción

Eventos

Generadores

Conectividad de datos

Usando Jasmine

Paso 2) Cree un archivo vacío en blanco llamado dataOutput.txt y colóquelo en la unidad D de su máquina local.

Paso 3) Escriba el siguiente código para llevar a cabo la transferencia de datos del archivo datainput.txt al archivo dataOutput.txt.

var fs = require("fs");var readStream = fs.createReadStream("D://datainput.txt");var writeStream = fs.createWriteStream("D://dataOutput.txt");readStream.pipe(writeStream);

Explicación del código: -

  1. Primero estamos creando un "readstream" en nuestro archivo datainput.txt que contiene todos nuestros datos que necesitan ser transferidos al nuevo archivo.
  2. Luego, necesitamos crear una "corriente de escritura" en nuestro archivo dataOutput.txt, que es nuestro archivo vacío y es el destino para la transferencia de datos desde el archivo datainput.txt.
  3. Luego usamos el comando pipe para transferir los datos del flujo de lectura al flujo de escritura. El comando pipe tomará todos los datos que ingresen al flujo de lectura y los enviará al flujo de escritura.

Si ahora abre el archivo dataOutput.txt, verá todos los datos que estaban presentes en el archivo datainput.txt.

Eventos en Node.js

Los eventos son uno de los conceptos clave en Node.js y, a veces, Node.js se conoce como un marco impulsado por eventos.

Básicamente, un evento es algo que sucede. Por ejemplo, si se establece una conexión con una base de datos, se activa el evento de conexión de la base de datos. La programación impulsada por eventos es para crear funciones que se activarán cuando se activen eventos específicos.

Veamos un ejemplo básico de cómo definir un evento en Node.js.

Vamos a crear un evento llamado 'data_received'. Cuando se activa este evento, el texto "datos recibidos" se enviará a la consola.

var events = require('events');var eventEmitter = new events.EventEmitter();eventEmitter.on('data_received', function() {console.log('data received succesfully.');});eventEmitter.emit('data_received');

Explicación del código: -

  1. Utilice la función require para incluir el módulo 'eventos'. Con este módulo, podrá crear eventos en Node.js.
  2. Crea un nuevo emisor de eventos. Esto se usa para vincular el evento, que en nuestro caso es "data_received" a una función de devolución de llamada que se define en el paso 3.
  3. Definimos una función dirigida por eventos que dice que si en caso de que se active el evento "data_received", entonces deberíamos enviar el texto "data_received" a la consola.
  4. Finalmente, tenemos un disparador manual de nuestro evento usando la función eventEmiter.emit. Esto activará el evento data_received.

Cuando se ejecuta el programa, el texto "datos recibidos" se enviará a la consola como se muestra a continuación.

Emisión de eventos

Al definir eventos, existen diferentes métodos para eventos que se pueden invocar. Este tema se centra en analizar cada uno de ellos en detalle.

  1. Controladores de eventos únicos

A veces, es posible que le interese reaccionar ante un evento solo la primera vez que ocurre. En estas situaciones, puede utilizar el método once ().

Veamos cómo podemos hacer uso del método once para los controladores de eventos.

Explicación del código: -

  1. Aquí estamos usando el método 'once' para decir que para el evento 'data_received', la función de devolución de llamada solo debe ejecutarse una vez.
  2. Aquí estamos activando manualmente el evento 'data_received'.
  3. Cuando el evento 'data_received' se active nuevamente, esta vez, no sucederá nada. Esto se debe al primer paso en el que dijimos que el evento solo se podía activar una vez.

Si el código se ejecuta correctamente, la salida en el registro será 'datos_ recibidos con éxito'. Este mensaje solo aparecerá una vez en la consola.

  1. Inspección de los oyentes de eventos

En cualquier momento de su vida, un emisor de eventos puede tener cero o más oyentes adjuntos. Los oyentes de cada tipo de evento se pueden inspeccionar de varias formas.

Si solo está interesado en determinar la cantidad de oyentes adjuntos, no busque más que el método EventEmitter.listenerCount ().

( Nota: los oyentes son importantes porque el programa principal debe saber si se están agregando oyentes sobre la marcha a un evento; de lo contrario, el programa funcionará mal porque se llamarán a más oyentes)

Explicación del código: -

  1. Estamos definiendo un tipo eventEmitter que se requiere para usar los métodos relacionados con eventos.
  2. Luego, estamos definiendo un objeto llamado emisor que se utilizará para definir nuestros controladores de eventos.
  3. Estamos creando 2 controladores de eventos que básicamente no hacen nada. Esto se mantiene simple para nuestro ejemplo solo para mostrar cómo funciona el método listenerCount.
  4. Ahora, cuando invoque el método listenerCount en nuestro evento data_received, enviará el número de oyentes de eventos adjuntos a este evento en el registro de la consola.

Si el código se ejecuta correctamente, el valor de 2 se mostrará en el registro de la consola.

  1. El evento newListener

Cada vez que se registra un nuevo controlador de eventos, el emisor de eventos emite un evento newListener. Este evento se utiliza para detectar nuevos controladores de eventos. Por lo general, usa el evento newListener cuando necesita asignar recursos o realizar alguna acción para cada nuevo controlador de eventos.

var events = require('events');var eventEmitter = events.EventEmitter;var emitter = new eventEmitter();emitter.on("newListener", function(eventName, listener) {console.log("Added listener for " + eventName + " events");});emitter.on('data_received', function() {});emitter.on('data_received', function() {});

Explicación del código: -

  1. Estamos creando un nuevo controlador de eventos para el evento 'newListener'. Entonces, cada vez que se registra un nuevo controlador de eventos, el texto "Oyente agregado para" + el nombre del evento se mostrará en la consola.
  2. Aquí estamos escribiendo en la consola el texto "Oyente agregado para" + el nombre del evento para cada evento registrado.
  3. Estamos definiendo 2 controladores de eventos para nuestro evento 'data_received'.

Si el código anterior se ejecuta correctamente, el texto siguiente se mostrará en la consola. Simplemente muestra que el controlador de eventos 'newListener' se activó dos veces.

Oyente agregado para eventos data_received

Oyente agregado para eventos data_received

Resumen

  • Las transmisiones se utilizan en Node.js para leer y escribir datos desde dispositivos de entrada y salida. Node.js hace uso de la biblioteca 'fs' para crear flujos de archivos legibles y de escritura. Estos flujos se pueden utilizar para leer y escribir datos de archivos.
  • Las tuberías se pueden utilizar para conectar varios flujos juntos. Uno de los ejemplos más comunes es canalizar el flujo de lectura y escritura juntos para la transferencia de datos de un archivo a otro.
  • Node.js a menudo también se etiqueta como un marco impulsado por eventos, y es muy fácil definir eventos en Node.js. Se pueden definir funciones que respondan a estos eventos.
  • Los eventos también exponen métodos para responder a eventos clave. Por ejemplo, hemos visto el controlador de eventos once () que se puede usar para asegurarse de que una función de devolución de llamada solo se ejecute una vez cuando se activa un evento.

Articulos interesantes...