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 unReadable
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.