Descubra para qué sirven las transmisiones, por qué son tan importantes y cómo utilizarlas.
- Que son las corrientes
- Por que streams
- Un ejemplo de una corriente
- tubo()
- API de nodo impulsadas por Streams
- Diferentes tipos de corrientes
- Cómo crear una secuencia legible
- Cómo crear una secuencia de escritura
- Cómo obtener datos de una secuencia legible
- Cómo enviar datos a una secuencia de escritura
- Señalar una secuencia de escritura que terminó de escribir
Que son las corrientes
Las transmisiones son uno de los conceptos fundamentales que impulsan las aplicaciones de Node.js.
Son una forma de manejar archivos de lectura / escritura, comunicaciones de red o cualquier tipo de intercambio de información de un extremo a otro de una manera eficiente.
Las transmisiones no son un concepto exclusivo de Node.js. Fueron introducidos en el sistema operativo Unix hace décadas, y los programas pueden interactuar entre sí pasando flujos a través del operador de tubería (|
).
Por ejemplo, de la manera tradicional, cuando le dice al programa que lea un archivo, el archivo se lee en la memoria, de principio a fin, y luego lo procesa.
Utilizando secuencias, lo lees pieza por pieza, procesando su contenido sin guardarlo todo en la memoria.
El Node.jsstream
móduloproporciona la base sobre la que se construyen todas las API de transmisión.
Por que streams
Las transmisiones ofrecen básicamente dos ventajas importantes al utilizar otros métodos de manejo de datos:
- Eficiencia de la memoria: no necesita cargar grandes cantidades de datos en la memoria antes de poder procesarlos
- Eficiencia de tiempo: toma mucho menos tiempo comenzar a procesar datos tan pronto como los tiene, en lugar de esperar hasta que toda la carga útil de datos esté disponible para comenzar
Un ejemplo de una corriente
Un ejemplo típico es el de leer archivos de un disco.
Usando el nodofs
módulo puede leer un archivo y servirlo a través de HTTP cuando se establece una nueva conexión a su servidor http:
const http = require('http')
const fs = require('fs')
const server = http.createServer(function (req, res) {
fs.readFile(__dirname + ‘/data.txt’, (err, data) => {
res.end(data)
})
})
server.listen(3000)
readFile()
lee el contenido completo del archivo e invoca la función de devolución de llamada cuando está listo.
res.end(data)
en la devolución de llamada devolverá el contenido del archivo al cliente HTTP.
Si el archivo es grande, la operación llevará bastante tiempo. Aquí está escrito lo mismo usando streams:
const http = require('http')
const fs = require('fs')
const server = http.createServer((req, res) => {
const stream = fs.createReadStream(__dirname + ‘/data.txt’)
stream.pipe(res)
})
server.listen(3000)
En lugar de esperar hasta que el archivo se lea por completo, comenzamos a transmitirlo al cliente HTTP tan pronto como tengamos una gran cantidad de datos listos para ser enviados.
tubo()
El ejemplo anterior usa la líneastream.pipe(res)
: lapipe()
se llama al método en la secuencia de archivos.
¿Qué hace este código? Toma la fuente y la canaliza hacia un destino.
Lo llama en la secuencia de origen, por lo que en este caso, la secuencia de archivo se canaliza a la respuesta HTTP.
El valor de retorno de lapipe()
método es el flujo de destino, que es algo muy conveniente que nos permite encadenar múltiplespipe()
llamadas, así:
src.pipe(dest1).pipe(dest2)
Esta construcción es lo mismo que hacer
src.pipe(dest1)
dest1.pipe(dest2)
API de nodo impulsadas por Streams
Debido a sus ventajas, muchos módulos centrales de Node.js brindan capacidades nativas de manejo de transmisiones, en particular:
process.stdin
devuelve una secuencia conectada a stdinprocess.stdout
devuelve una transmisión conectada a stdoutprocess.stderr
devuelve una transmisión conectada a stderrfs.createReadStream()
crea una secuencia legible en un archivofs.createWriteStream()
crea una secuencia de escritura en un archivonet.connect()
inicia una conexión basada en flujohttp.request()
devuelve una instancia de la clase http.ClientRequest, que es una secuencia de escriturazlib.createGzip()
comprimir datos usando gzip (un algoritmo de compresión) en una secuenciazlib.createGunzip()
descomprimir una secuencia gzip.zlib.createDeflate()
comprimir datos usando deflate (un algoritmo de compresión) en una secuenciazlib.createInflate()
descomprimir una corriente desinflada
Diferentes tipos de corrientes
Hay cuatro clases de corrientes:
Readable
: una secuencia desde la que puede canalizar, pero no canalizar (puede recibir datos, pero no enviar datos). Cuando inserta datos en una secuencia legible, se almacena en búfer hasta que un consumidor comienza a leer los datos.Writable
: una secuencia a la que puede canalizar, pero no desde (puede enviar datos, pero no recibirlos)Duplex
: una secuencia en la que puede canalizar y desde la que puede canalizar, básicamente una combinación de una secuencia legible y escribibleTransform
: un flujo de transformación es similar a un dúplex, pero la salida es una transformación de su entrada
Cómo crear una secuencia legible
Obtenemos la secuencia legible delstream
módulo, y lo inicializamos
const Stream = require('stream')
const readableStream = new Stream.Readable()
Ahora que la transmisión está inicializada, podemos enviarle datos:
readableStream.push('hi!')
readableStream.push('ho!')
Cómo crear una secuencia de escritura
Para crear una secuencia de escritura, ampliamos la base.Writable
objeto, e implementamos su método _write ().
Primero crea un objeto de flujo:
const Stream = require('stream')
const writableStream = new Stream.Writable()
luego implementar_write
:
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
Ahora puede canalizar una secuencia legible en:
process.stdin.pipe(writableStream)
Cómo obtener datos de una secuencia legible
¿Cómo leemos los datos de una secuencia legible? Usando una secuencia de escritura:
const Stream = require('stream')
const readableStream = new Stream.Readable()
const writableStream = new Stream.Writable()
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
readableStream.pipe(writableStream)
readableStream.push(‘hi!’)
readableStream.push(‘ho!’)
También puede consumir una secuencia legible directamente, utilizando elreadable
evento:
readableStream.on('readable', () => {
console.log(readableStream.read())
})
Cómo enviar datos a una secuencia de escritura
Usando la corrientewrite()
método:
writableStream.write('hey!\n')
Señalar una secuencia de escritura que terminó de escribir
Utilizar elend()
método:
const Stream = require('stream')
const readableStream = new Stream.Readable()
const writableStream = new Stream.Writable()
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
readableStream.pipe(writableStream)
readableStream.push(‘hi!’)
readableStream.push(‘ho!’)
writableStream.end()
Descarga mi gratisManual de Node.js
Más tutoriales de nodos:
- Una introducción al administrador de paquetes npm
- Introducción a Node.js
- Solicitudes HTTP usando Axios
- Dónde alojar una aplicación Node.js
- Interactuar con la API de Google Analytics usando Node.js
- El corredor de paquetes de nodo npx
- La guía package.json
- ¿Dónde instala npm los paquetes?
- Cómo actualizar Node.js
- Cómo usar o ejecutar un paquete instalado usando npm
- El archivo package-lock.json
- Control de versiones semántico usando npm
- ¿Deberías enviar la carpeta node_modules a Git?
- Actualice todas las dependencias de Node a su última versión
- Analizando JSON con Node.js
- Encuentre la versión instalada de un paquete npm
- Secuencias de Node.js
- Instale una versión anterior de un paquete npm
- Obtener la carpeta actual en el nodo
- Cómo registrar un objeto en Node
- Exponer la funcionalidad de un archivo de nodo mediante exportaciones
- Diferencias entre el nodo y el navegador
- Hacer una solicitud HTTP POST usando Node
- Obtener datos del cuerpo de la solicitud HTTP usando Node
- Búferes de nodo
- Una breve historia de Node.js
- Cómo instalar Node.js
- ¿Cuánto JavaScript necesita saber para usar Node?
- Cómo usar el REPL de Node.js
- Nodo, acepta argumentos de la línea de comando
- Salida a la línea de comando usando Node
- Acepte la entrada de la línea de comando en el nodo
- Desinstalación de paquetes npm con `npm uninstall`
- paquetes locales o globales de npm
- dependencias npm y devDependencies
- El ciclo de eventos de Node.js
- Entendiendo process.nextTick ()
- Entendiendo setImmediate ()
- El emisor de eventos de nodo
- Construye un servidor HTTP
- Realización de solicitudes HTTP con Node
- El módulo Node fs
- Solicitudes HTTP en Node usando Axios
- Leer archivos con Node
- Rutas de archivo de nodo
- Escribir archivos con Node
- Estadísticas de archivos de nodo
- Trabajar con descriptores de archivo en Node
- Trabajar con carpetas en Node
- El módulo de ruta de nodo
- El módulo http de nodo
- Usando WebSockets con Node.js
- Los conceptos básicos para trabajar con MySQL y Node
- Manejo de errores en Node.js
- La guía Pug
- Cómo leer variables de entorno de Node.js
- Cómo salir de un programa de Node.js
- El módulo Node os
- El módulo de eventos de nodo
- Nodo, la diferencia entre desarrollo y producción
- Cómo comprobar si existe un archivo en Node.js
- Cómo crear un archivo vacío en Node.js
- Cómo eliminar un archivo con Node.js
- Cómo obtener la última fecha de actualización de un archivo usando Node.js
- Cómo determinar si una fecha es hoy en JavaScript
- Cómo escribir un objeto JSON en un archivo en Node.js
- ¿Por qué debería usar Node.js en su próximo proyecto?
- Ejecute un servidor web desde cualquier carpeta
- Cómo usar MongoDB con Node.js
- Utilice Chrome DevTools para depurar una aplicación Node.js
- ¿Qué es pnpm?
- La lista de opciones de Node.js Runtime v8
- Cómo corregir el error "Falta acceso de escritura" al usar npm
- Cómo habilitar los módulos ES en Node.js
- Cómo generar un proceso hijo con Node.js
- Cómo obtener tanto el cuerpo analizado como el cuerpo crudo en Express
- Cómo manejar la carga de archivos en Node.js
- ¿Qué son las dependencias entre pares en un módulo de nodo?
- Cómo escribir un archivo CSV con Node.js
- Cómo leer un archivo CSV con Node.js
- Los módulos principales del nodo
- Incrementar varios números de carpetas a la vez usando Node.js
- Cómo imprimir un lienzo en una URL de datos
- Cómo crear y guardar una imagen con Node.js y Canvas
- Cómo descargar una imagen usando Node.js
- Cómo cambiar el nombre de archivos en masa en Node.js
- Cómo obtener los nombres de todos los archivos en una carpeta en Node
- Cómo usar promesas y esperar con las funciones basadas en devolución de llamada de Node.js
- Cómo probar un paquete npm localmente
- Cómo verificar la versión actual de Node.js en tiempo de ejecución
- Cómo utilizar Sequelize para interactuar con PostgreSQL
- Sirve una página HTML con Node.js
- Cómo resolver el error `util.pump is not a function` en Node.js