2012-07-12 9 views
143

Estoy usando el siguiente código node.js para descargar documentos desde alguna URL y guardarlos en el disco. Deseo recibir información sobre cuándo se descarga el documento. No he visto ninguna devolución de llamada con pipe. O, ¿Hay algún evento 'final' que se pueda capturar al finalizar la descarga?devolución de llamada para manejar la finalización de la tubería

request(some_url_doc).pipe(fs.createWriteStream('xyz.doc')); 

Respuesta

218

Las transmisiones son EventEmitter s para que pueda escuchar ciertos eventos. Como dijo, hay un evento finish para solicitarlo (anteriormente end).

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

Para obtener más información acerca de los eventos disponibles, puede consultar el stream documentation page.

+11

'var r = petición (...) en ("fin", la función () {/ * CALLBACK * /}). Pipe (...); ' –

+6

para mí el evento 'close', en lugar de 'end' funciona' r.on ('close'), function() {... }) ' – Judson

+8

El evento 'end' ahora es 'finalizado' Eventos de canalizaciones: http://nodejs.org/api/stream.html#stream_event_finish –

28

Basado en el documento nodejs, http://nodejs.org/api/stream.html#stream_event_finish, debe manejar el evento finish de writableStream.

var writable = getWriteable(); 
var readable = getReadable(); 
readable.pipe(writable); 
writable.on('finish', function(){ ... }); 
+0

La respuesta aceptada no funciona para mí con el nodo v0.12.7, pero su solución sí lo hace. –

6

Fragmento de código para el contenido de la tubería desde la web a través de http (s) al sistema de archivos. Como @starbeamrainbowlabs notaron caso finish hace trabajo

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); 
}); 
+0

El 'final' funciona para mí y 'final' no. ¡Gracias! – shaosh

+0

en un caso particular, el final parece estar activando antes de que lleguen todos los bytes esperados – Michael

1

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

La mayor parte del ejemplo crea readStreams del archivo. Pero en mi caso readStream tiene que crearse a partir del JSON cadena procedente de un grupo de mensajes.

var jsonStream = through2.obj(function(chunk, encoding, callback) { 
        this.push(JSON.stringify(chunk, null, 4) + '\n'); 
        callback(); 
       }); 
// message.vale --> valeu/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); 
+0

En lugar de escuchar para "finalizar", tiene dos manejadores para "cerrar", tal vez esa fue la razón. El evento "finalizar" funciona para mí. – jowo

0

he aquí una solución que se encarga de errores en las solicitudes de devolución de llamada y llama a un después de que el archivo está escrito:.

request(opts) 
    .on('error', function(err){ return callback(err)}) 
    .pipe(fs.createWriteStream(filename)) 
    .on('finish', function (err) { 
     return callback(err); 
    }); 
Cuestiones relacionadas