borunun tamamlanması için geri arama


196

Bazı URL'lerden belgeleri indirmek ve diske kaydetmek için aşağıdaki node.js kodunu kullanıyorum. Belgenin indirildiği zaman haberdar olmak istiyorum. pipe ile herhangi bir geri arama görmedim.Ya da, indirme tamamlandığında yakalanabilir herhangi bir 'son' olay var mı?

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

Yanıtlar:


302

Akımlar EventEmitters'dir, böylece belirli olayları dinleyebilirsiniz. Söylediğiniz gibi finish(önceden end) talep için bir olay var .

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

Hangi olayların mevcut olduğu hakkında daha fazla bilgi için akış dokümantasyon sayfasını kontrol edebilirsiniz .


12
var r = request(...).on("end",function(){/* CALLBACK */}).pipe(...);
Denys Vitali

6
benim için 'son' değil, 'yakın' olayır.on('close'), function () {...})
Judson

9
'End' etkinliği şimdi 'bitir'. Pipe etkinlikleri: nodejs.org/api/stream.html#stream_event_finish
Pier-Luc

13
'End' olayı hala var ve Okunabilir akışlarda kullanılıyor. Yazılabilir akışlar 'bitiş'i kullanır. Bunun nedeni, Transform akışının her ikisinin bir karışımı olması ve olaylar arasında ayrım yapılması gerektiğidir.
noderman

16
Bu iş parçacığı, düğüm akışlarıyla çalışmanın nasıl göründüğünün iyi bir özetidir.
pomber


9

İçeriği web'den http (s) üzerinden dosya sistemine borulamak için kod snippet'i. @Starbeamrainbowlabs fark ettiği gibi etkinlik finish

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

On 'bitiş' benim için çalışıyor ve 'bitiş' çalışmıyor. Teşekkür ederim!
shaosh

1
belirli bir durumda, beklenen tüm baytların gelmesinden önce bitiş ateş ediyor gibi görünüyor
Michael

4

Bu bağlamla ilgili sorunumun biraz farklı bir çözümünü buldum. Paylaşmaya değer düşündüm.

Örneğin çoğu readStreamsdosyadan oluşturulur. Ama benim durumumda bir mesaj havuzundan readStreamgelen JSONdize oluşturulmalıdır .

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

"Bitirmek" için dinlemek yerine, "kapat" için iki işleyiciniz var, belki de nedeni buydu. "Bitiş" etkinliği benim için çalışıyor.
jowo

3

Dosya yazıldıktan sonra isteklerdeki hataları işleyen ve geri aramayı çağıran bir çözüm:

request(opts)
    .on('error', function(err){ return callback(err)})
    .pipe(fs.createWriteStream(filename))
    .on('finish', function (err) {
        return callback(err);
    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.