tutorial produccion principiantes para nodejs node libro iniciar ejemplos correr aplicacion node.js stream fs

node.js - produccion - nodejs



¿Cómo cerrar una secuencia legible(antes de finalizar)? (8)

Invoque input.close() . No está en los documentos, pero

https://github.com/joyent/node/blob/cfcb1de130867197cbc9c6012b7e84e08e53d032/lib/fs.js#L1597-L1620

claramente hace el trabajo :) En realidad hace algo similar a su isEnded .

EDIT 2015-Apr-19 Basado en los comentarios a continuación, y para aclarar y actualizar:

  • Esta sugerencia es un truco, y no está documentado.
  • Aunque para ver el lib/fs.js actual todavía funciona> 1.5 años después.
  • Estoy de acuerdo con el siguiente comentario sobre llamar a destroy() siendo preferible.
  • Como se indica correctamente a continuación, esto funciona para ReadStreams fs , no en un Readable genérico

En cuanto a una solución genérica: no parece que exista una, al menos desde mi comprensión de la documentación y de una mirada rápida a _stream_readable.js .

Mi propuesta pondría su transmisión legible en modo pausa , al menos impidiendo el procesamiento posterior en su fuente de datos ascendente. No se olvide de unpipe() y eliminar todos data detectores de eventos de data para que pause() realidad, como se menciona en los documentos.

¿Cómo cerrar una secuencia legible en Node.js?

var input = fs.createReadStream(''lines.txt''); input.on(''data'', function(data) { // after closing the stream, this will not // be called again if (gotFirstLine) { // close this stream and continue the // instructions from this if console.log("Closed."); } });

Esto sería mejor que:

input.on(''data'', function(data) { if (isEnded) { return; } if (gotFirstLine) { isEnded = true; console.log("Closed."); } });

Pero esto no detendría el proceso de lectura ...


No puedes. No hay una forma documentada de cerrar / cerrar / abortar / destruir una secuencia legible genérica a partir del Nodo 5.3.0. Esta es una limitación de la arquitectura de flujo de nodo.

Como han explicado otras respuestas aquí, existen hacks no documentados para implementaciones específicas de Legible proporcionadas por Node, como fs.ReadStream . Sin embargo, estas no son soluciones genéricas para cualquier lectura.

Si alguien puede probar que estoy mal aquí, por favor hazlo. Me gustaría poder hacer lo que digo que es imposible y estaría encantado de que me corrijan.

EDITAR : Aquí estaba mi solución alternativa: implementar .destroy() para mi canalización a través de una compleja serie de llamadas a unpipe() . Y después de toda esa complejidad, no funciona correctamente en todos los casos .


Puede borrar y cerrar la transmisión con yourstream.resume() , que descargará todo en la transmisión y, finalmente, lo cerrará.

De los documentos oficiales :

legible.resume ():

Regreso: esto

Este método hará que la secuencia legible vuelva a emitir eventos de ''datos''.

Este método cambiará la secuencia en modo flujo. Si no desea consumir los datos de una secuencia, pero desea llegar a su evento ''final'', puede llamar a stream.resume () para abrir el flujo de datos.

var readable = getReadableStreamSomehow(); readable.resume(); readable.on(''end'', () => { console.log(''got to the end, but did not read anything''); });


En la versión 4.*.* Presionar un valor nulo en la secuencia activará una señal EOF .

Desde el nodojs documentos

Si se pasa un valor distinto de null, el método push () agrega una porción de datos a la cola para que consuman los procesadores de flujo subsiguientes. Si se pasa null, indica el final de la secuencia (EOF), después de lo cual no se pueden escribir más datos.

Esto funcionó para mí después de probar muchas otras opciones en esta página.


ReadStream.destroy

Puede llamar a la función ReadStream.destroy en cualquier momento.

var fs = require(''fs''); var readStream = fs.createReadStream(''lines.txt''); readStream .on(''data'', function (chunk) { console.log(chunk); readStream.destroy(); }) .on(''end'', function () { // This may not been called since we are destroying the stream // the first time ''data'' event is received console.log(''All the data in the file has been read''); }) .on(''close'', function (err) { console.log(''Stream has been destroyed and file has been closed''); });

La función pública ReadStream.destroy no está documentada (Node.js v0.12.2) pero puede echar un vistazo al código fuente en GitHub ( 5 de octubre de 2012 confirmar ).

La función de destroy marca internamente la instancia de ReadStream como destruida y llama a la función de close para liberar el archivo.

Puede escuchar el evento de cierre para saber exactamente cuándo se cierra el archivo. El evento final no se activará a menos que los datos se consuman por completo.

Tenga en cuenta que las funciones de destroy (y close ) son específicas de fs.ReadStream . No hay parte de la "interfaz" genérica stream.readable .


Es una vieja pregunta, pero yo también estaba buscando la respuesta y encontré la mejor para mi implementación. Se emiten eventos end y close , así que creo que esta es la solución más limpia.

Esto hará el truco en el nodo 4.4. * (Versión estable en el momento de la escritura):

var input = fs.createReadStream(''lines.txt''); input.on(''data'', function(data) { if (gotFirstLine) { this.end(); // Simple isn''t it? console.log("Closed."); } });

Para obtener una explicación muy detallada, consulte: http://www.bennadel.com/blog/2692-you-have-to-explicitly-end-streams-after-pipes-break-in-node-js.htm


Este código aquí hará el truco muy bien:

function closeReadStream(stream) { if (!stream) return; if (stream.close) stream.close(); else if (stream.destroy) stream.destroy(); }

writeStream.end () es la forma de ir a cerrar un writeStream ...


Este módulo de destrucción está destinado a asegurar que se destruya una secuencia, manejando diferentes API y errores Node.js. En este momento es una de las mejores opciones.