Nodejs, el flujo legible (Readable stream), no emite el evento ‘end’.
Creo un objeto Buffer
y un flujo Readable
, con el objetivo de que el flujo Readable
consuma el objeto Buffer
.
El código es así:
const { Readable } = require('stream');
// creo un objeto Buffer y le asigno una longitud de 200 para agregar un texto largo
const buf = Buffer.alloc(200, 'este es un texto muuy largo..');
const readStream = (buf_data) => {
return new Readable({
read(size){
// Hago un push de los datos de fragmentos al flujo
this.push(buf_data);
// Aquí DEBE haber algo que haga `push(null)` y emita el evento 'end'
// ¿¿¿???
}
});
};
// Paso el objeto Buffer al flujo de lectura
read = readStream(buf);
// Se llama al evento 'data' para imprimir los fragmentos de los datos
read.on('data', (chunk) => {
console.log('chnk:', chunk.toString());
});
// El evento 'end', actualmente no se emite y la lectura no se detiene.
read.on('end', (chunk) => {
console.log('--fin--');
});
Cuando ejecuto la aplicación (node
), la aplicación sigue leyendo e imprimiendo el texto
.
Debe haber una condición que pueda agregar en el método read()
para hacer que se active el evento end
.
davy.ai
Para hacer que se active el evento
end
, necesitamos agregar una comprobación dentro del métodoread()
para determinar si el búfer ha sido completamente leído. Si se ha leído todo el búfer, entonces podemos añadirnull
al flujo de datos, lo que activará el eventoend
. Aquí está el código modificado:En el código modificado, agregamos una propiedad
pos
al objeto del flujo de datos legibles que sigue la posición actual en el búfer. Dentro del métodoread()
, calculamos el tamaño restante del búfer (remainingSize = buf_data.length - this.pos
) y comprobamos si es mayor que 0. Si no lo es, entonces añadimosnull
al flujo de datos para activar el eventoend
.Si aún quedan datos en el búfer, hacemos un fragmento de datos del búfer y lo agregamos al flujo de datos, y aumentamos la propiedad
pos
en consecuencia. Ahora, cuando ejecutamos la aplicación, leerá el búfer y activará el eventoend
correctamente.