devolución de llamada para manejar la finalización de la tubería

Resuelto user644745 asked hace 12 años • 5 respuestas

Estoy usando el siguiente código de node.js para descargar documentos desde alguna URL y guardarlos en el disco. Quiero que me informen cuando se descarga el documento. No he visto ninguna devolución de llamada con pipe. O, ¿hay algún evento de "fin" que pueda capturarse al finalizar la descarga?

request(some_url_doc).pipe(fs.createWriteStream('xyz.doc'));
user644745 avatar Jul 12 '12 15:07 user644745
Aceptado

Las transmisiones son EventEmitterpara que puedas escuchar ciertos eventos. Como dijiste, hay un finishevento para solicitud (anteriormente end).

 var stream = request(...).pipe(...);
 stream.on('finish', function () { ... });

Para obtener más información sobre qué eventos están disponibles, puede consultar la página de documentación de la transmisión .

Pickels avatar Jul 12 '2012 08:07 Pickels

Documento basado en nodejs, http://nodejs.org/api/stream.html#stream_event_finish , debería manejar finishel evento de writableStream.

var writable = getWriteable();
var readable = getReadable();
readable.pipe(writable);
writable.on('finish', function(){ ... });
vr3C avatar Oct 13 '2014 08:10 vr3C

Fragmento de código para canalizar contenido desde la web a través de http(s) al sistema de archivos. Como @starbeamrainbowlabs notó, el evento finishfunciona

var tmpFile = "/tmp/somefilename.doc";

var ws = fs.createWriteStream(tmpFile);
ws.on('finish', function() {
  // pipe done here, do something with file
});

var client = url.slice(0, 5) === 'https' ? https : http;
client.get(url, function(response) {
  return response.pipe(ws);
});
ruX avatar Sep 11 '2015 15:09 ruX

Encontré una solución un poco diferente a mi problema con respecto a este contexto. Pensamiento que vale la pena compartir.

La mayor parte del ejemplo se crea readStreamsa partir de un archivo. Pero en mi caso readStreamdebe crearse a partir de JSONuna cadena proveniente de un grupo de mensajes.

var jsonStream = through2.obj(function(chunk, encoding, callback) {
                    this.push(JSON.stringify(chunk, null, 4) + '\n');
                    callback();
                });
// message.value --> value/text to write in write.txt 
jsonStream.write(JSON.parse(message.value));
var writeStream = sftp.createWriteStream("/path/to/write/write.txt");

//"close" event didn't work for me!
writeStream.on( 'close', function () {
    console.log( "- done!" );
    sftp.end();
    }
);

//"finish" event didn't work for me either!
writeStream.on( 'close', function () {
    console.log( "- done!"
        sftp.end();
        }
);

// finally this worked for me!
jsonStream.on('data', function(data) {
    var toString = Object.prototype.toString.call(data);
    console.log('type of data:', toString);
    console.log( "- file transferred" );
});

jsonStream.pipe( writeStream );
Abu Shumon avatar Mar 09 '2016 08:03 Abu Shumon