2012-07-12 10 views
143

Sto usando il seguente codice node.js per scaricare documenti da qualche URL e salvarlo sul disco. Voglio essere informato su quando il documento viene scaricato. non ho visto alcuna richiamata con pipe.O, c'è qualche evento 'end' che può essere catturato al termine del download?callback per gestire il completamento del pipe

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

risposta

218

Streams sono EventEmitter s in modo da poter ascoltare determinati eventi. Come hai detto, c'è un evento finish per la richiesta (in precedenza end).

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

Per ulteriori informazioni su quali eventi sono disponibili è possibile controllare lo stream documentation page.

+11

'var r = richiesta (...) il ("fine", la funzione () {/ * CALLBACK * /}). Pipe (...); ' –

+6

per me l'evento 'close', piuttosto che 'end' funziona' r.on ('close'), function() {... }) ' – Judson

+8

L'evento 'end' è ora 'finish' Eventi pipe: http://nodejs.org/api/stream.html#stream_event_finish –

28

Documento nodejs basato, http://nodejs.org/api/stream.html#stream_event_finish, deve gestire l'evento finish di writableStream.

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

La risposta accettata non funziona con il nodo v0.12.7, ma la soluzione è valida. –

6

Snippet di codice per il piping di contenuti da Web tramite http (s) al filesystem. Come notato @starbeamrainbowlabs evento finish fa lavoro

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

Il termine "finitura" funziona per me e "fine" no. Grazie! – shaosh

+0

in un caso particolare, la finitura sembra sparare prima che arrivino tutti i byte attesi – Michael

1

ho trovato una diversa soluzione un po 'del mio problema per quanto riguarda questo contesto. Il pensiero vale la pena condividere.

La maggior parte dell'esempio crea readStreams dal file. Ma nel mio caso è necessario creare readStream dalla stringa JSON proveniente da un pool di messaggi.

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

Invece di ascoltare per "finire" ci sono due gestori per "chiudi", forse questo era il motivo. L'evento "fine" funziona per me. – jowo

0

Ecco una soluzione che gestisce gli errori nelle richieste e chiama un callback dopo che il file è scritto:.

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