Node.js es naturalmente asincrónico y basado en eventos, y es ideal para manejar tareas relacionadas con E/S. Si está tratando con operaciones relacionadas con E/S en su aplicación, puede aprovechar las transmisiones en Node.js. Por lo tanto, echemos un vistazo a las transmisiones en detalle y comprendamos cómo simplifican las operaciones de E/S.
Que es el flujo
Las transmisiones son tuberías UNIX que le permiten leer fácilmente datos de una fuente de datos y luego fluir a otro destino.
En pocas palabras, la transmisión no es algo especial, es solo un emisor de eventos que implementa algunos métodos. Según el método que implementa, la transmisión puede convertirse en una secuencia legible (legible), una secuencia de escritura (escritura) o una transmisión bidireccional (dúplex, legible y escritura).
Una secuencia legible le permite leer datos de una fuente de datos, mientras que una secuencia escrito le permite escribir datos en su destino.
Si ha usado Node.js, es probable que haya encontrado la transmisión.
Por ejemplo, en un servidor node.js http, la solicitud es una secuencia legible y la respuesta es un flujo de escritura.
También es posible que haya usado el módulo FS, que puede ayudarlo a manejar transmisiones legibles y de escritura.
Ahora le permita aprender algunos conceptos básicos y comprender los diferentes tipos de flujos. Este artículo discutirá transmisiones legibles y escritas. Las corrientes bidireccionales están más allá del alcance de este artículo y no las discutiremos.
Transmisiones legibles
Podemos usar una secuencia legible para leer datos de una fuente de datos, que puede ser cualquier cosa, como un archivo en el sistema, un búfer en la memoria o incluso otras transmisiones. Debido a que las transmisiones son Eventemitters, envían datos con varios eventos. Usaremos estos eventos para que el flujo funcione.
Leer datos de Stream
La mejor manera de leer los datos de una transmisión es escuchar eventos de datos y agregar una función de devolución de llamada. Cuando los datos fluyan, la secuencia legible enviará un evento de datos y la función de devolución de llamada se activará. Eche un vistazo al siguiente fragmento de código:
var fs = request ('fs'); var readAlSteam = fs.CreateReadStream ('file.txt'); var data = '' '; var readAlSteam.on (' data ', function (shunk) {data += chunk;}); readAbleStream.on (' end ', function () {console.log (data);});Fs.CreateReadStream le dará una transmisión legible.
Al principio, esta corriente no era dinámica de flujo. Cuando agrega el oyente de eventos de datos y agrega una función de devolución de llamada, se volverá fluyendo. Después de esto, leerá un pequeño dato y lo pasará a su función de devolución de llamada.
El implementador de la transmisión determina la frecuencia de activación del evento de datos. Por ejemplo, la solicitud HTTP activará el evento de datos cuando se lean varios KB de datos. Cuando lee datos de un archivo, puede decidir activar el evento de datos cuando se termina una línea.
Cuando no hay datos para leer (cuando se lee al final del archivo), la transmisión enviará un evento final. En el ejemplo anterior, escuchamos este evento e imprimimos los datos cuando terminamos de leer el archivo.
Hay otra forma de leer transmisiones. Solo necesita seguir llamando al método Read () en la instancia de transmisión antes de leer al final del archivo.
var fs = request ('fs'); var readAlseReam = fs.CreateReadStream ('file.txt'); var data = ''; var chunk; readAlSteam.on ('readable', function () {while ((chunk = readableStream.Read ())! = NULL) {data += chunk;}); readableSteam.on ('end',) console.log (datos);});El método Read () lee datos del búfer interno y devuelve NULL cuando no hay datos para leer.
Por lo tanto, en el bucle While verificamos si Read () devuelve NULL, y cuando devuelve nulo, el bucle se terminará.
Cabe señalar que cuando podamos leer datos de la transmisión, el evento legible será despedido.
Codificación establecida
Por defecto, lo que lee de la transmisión es un objeto búfer. Si está leyendo una cadena, esto no es para usted. Por lo tanto, puede establecer la codificación de la transmisión llamando a Lecable.setEncoding () como en el siguiente ejemplo:
var fs = request ('fs'); var readAlseReam = fs.CreateReadStream ('file.txt'); var data = '' '; readAlSteam.setEncoding (' utf8 '); readecureMeReam.on (' data ', function (chunk) {data += chunk;}); readEmarream.on (' finalEn el ejemplo anterior, si establecemos la codificación de la secuencia en UTF8, los datos se analizarán en UTF8, y la fragmentación en la función de devolución de llamada será una cadena.
Tubería
Las tuberías son un gran mecanismo en el que puede leer datos de una fuente de datos sin administrar el estado de la transmisión tú mismo y escribirlos en su destino. Echemos un vistazo al siguiente ejemplo:
var fs = request ('fs'); var readAlseReam = fs.CreateReadStream ('file1.txt'); var writableStream = fs.CreatewriteStream ('file2.txt'); readAlSteam.pipe (writableStream);El ejemplo anterior utiliza el método Pipe () para escribir el contenido de File1 a File2. Debido a que Pipe () lo ayudará a administrar el flujo de datos, no necesita preocuparse por la velocidad del flujo de datos. Esto hace que la tubería () sea muy simple y fácil de usar.
Cabe señalar que Pipe () devuelve la secuencia de destino, ¡por lo que puede vincular fácilmente múltiples transmisiones!
Enlace (encadenamiento)
Supongamos que hay un archivo de archivo y desea descomponerlo. Hay muchas formas de lograr esta tarea. Pero la forma más simple es usar tuberías y enlaces:
var fs = require ('fs'); var zlib = require ('zLib'); fs.CreateReadStream ('input.txt.gz') .pipe (zLib.CreateGunzip ().)Primero, creamos una secuencia legible a través de input.txt.gz y luego dejamos que transmita la transmisión zLib.CreateGunzip (), que descomprime el contenido. Finalmente, agregamos un flujo de escritura para escribir el contenido descomprimido a otro archivo.
Otros métodos
Hemos discutido algunos conceptos importantes en transmisiones legibles, y aquí hay algunas formas en que necesita saber:
1.Readable.Pause () Este método pausará el flujo del flujo. En otras palabras, no activará el evento de datos nuevamente.
2. El método reelegable.resume () es lo opuesto de lo anterior y permitirá que el flujo de pausa reanude el flujo.
3. Readable.unpipe () El método eliminará el destino. Si se pasan parámetros, permitirá que la transmisión legible detenga el destino específico de Liu Xiang, de lo contrario eliminará todos los destinos.
Corrientes de escritura
Una secuencia de escritura le permite escribir datos en su destino. Al igual que las transmisiones legibles, estos son EventEmitters, y también desencadenan diferentes eventos. Echemos un vistazo a los eventos y métodos que se activarán en la corriente de escritura.
Escribir para transmitir
Para escribir datos como un flujo de escritura, debe llamar al método Write () en la instancia de secuencia de escritura y ver el siguiente ejemplo:
var fs = require ('fs'); var readAlseReam = fs.CreateReadStream ('file1.txt'); var writableStream = fs.CreatewriteStream ('file2.txt'); readAlseReMeStram.SetEncoding ('utf8'); readEableRestream.on ('data', function (chounk) {writable.write ('chunk');});});});});});El código anterior es muy simple, solo lee los datos del flujo de entrada y los escribe al destino con Write ().
Este método devuelve un valor booleano para indicar si la escritura es exitosa. Si el verdadero devuelto, significa que la escritura es exitosa y puede continuar escribiendo más datos. Si es falso, significa que ocurrió algo de error y no puede continuar escribiendo ahora. Una corriente de escritura desencadena un evento de drenaje para decirle que puede continuar escribiendo datos.
Después de escribir los datos
Cuando no necesita escribir datos, puede llamar al método End () para decirle a la transmisión que ha terminado de escribir. Suponiendo que Res es un objeto de respuesta HTTP, generalmente enviará una respuesta al navegador:
res.write ('¡Algunos datos!');
res.end ();
Cuando se llama a End (), todos los datos se escriben y la transmisión activará un evento de finalización. Tenga en cuenta que después de llamar end (), ya no puede escribir datos en la secuencia escritable. Por ejemplo, el siguiente código informará un error:
res.write ('¡Algunos datos!');
res.end ();
res.write ('tratando de volver a escribir'); //Error !
Aquí hay algunos eventos importantes relacionados con transmisiones de escritura:
1.Error se dispara cuando se produce un error por escrito o vinculación
2.Pipe Cuando la transmisión legible está vinculada a la transmisión de escritura, este evento se activará
3. Unpipe se disparará cuando la transmisión se llame a la corriente
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.