rappel pour gérer l’achèvement du tuyau

J’utilise le code node.js suivant pour télécharger des documents à partir d’une URL et les enregistrer sur le disque. Je veux être informé de la date de téléchargement du document. Je n’ai pas vu de rappel avec pipe.Or Y a-t-il un événement “end” qui peut être capturé à la fin du téléchargement?

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

Les stream sont des EventEmitter afin que vous puissiez écouter certains événements. Comme vous l’avez dit, il y a un événement finish pour la demande (précédemment finish ).

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

Pour plus d’informations sur les événements disponibles, vous pouvez consulter la page de documentation du stream .

Basé sur le document nodejs, http://nodejs.org/api/stream.html#stream_event_finish , il devrait gérer l’événement d’arrêt de finish .

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

Extrait de code pour canaliser le contenu du Web via http (s) vers le système de fichiers. Comme @starbeamrainbowlabs a remarqué que la finish événement fait un travail

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

J’ai trouvé une solution un peu différente de mon problème concernant ce contexte. Pensée mérite d’être partagée.

La plupart des exemples créent des readStreams partir d’un fichier. Mais dans mon cas, readStream doit être créé à partir d’une chaîne JSON provenant d’un pool de messages.

 var jsonStream = through2.obj(function(chunk, encoding, callback) { this.push(JSON.ssortingngify(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 toSsortingng = Object.prototype.toSsortingng.call(data); console.log('type of data:', toSsortingng); console.log( "- file transferred" ); }); jsonStream.pipe( writeStream ); 

Voici une solution qui gère les erreurs dans les requêtes et appelle un rappel une fois le fichier écrit:

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