devolución de llamada para manejar la finalización de la tubería
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'));
Las transmisiones son EventEmitter
para que puedas escuchar ciertos eventos. Como dijiste, hay un finish
evento 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 .
Documento basado en nodejs, http://nodejs.org/api/stream.html#stream_event_finish , debería manejar finish
el evento de writableStream.
var writable = getWriteable();
var readable = getReadable();
readable.pipe(writable);
writable.on('finish', function(){ ... });
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 finish
funciona
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);
});
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 readStreams
a partir de un archivo. Pero en mi caso readStream
debe crearse a partir de JSON
una 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 );