mengubah
Transform stream dapat dibaca dan ditulis, dan karenanya benar-benar bagus 'stream tengah'. Karena alasan ini, mereka kadang-kadang disebut sebagai through
stream. Mereka mirip dengan aliran duplex dengan cara ini, kecuali mereka menyediakan antarmuka yang bagus untuk memanipulasi data daripada hanya mengirimkannya. Tujuan dari aliran transformasi adalah untuk memanipulasi data saat disalurkan melalui aliran. Anda mungkin ingin melakukan beberapa panggilan async, misalnya, atau menurunkan beberapa bidang, memetakan beberapa hal, dll.
Untuk cara membuat aliran transformasi lihat di sini dan di sini . Yang harus Anda lakukan adalah:
- termasuk modul stream
- instantiate (atau mewarisi dari) kelas Transform
- menerapkan
_transform
metode yang membutuhkan a (chunk, encoding, callback)
.
Potongan adalah data Anda. Sebagian besar waktu Anda tidak perlu khawatir tentang penyandian jika Anda bekerja objectMode = true
. Callback dipanggil saat Anda selesai memproses chunk. Potongan ini kemudian didorong ke aliran berikutnya.
Jika Anda menginginkan modul pembantu yang bagus yang akan memungkinkan Anda melakukan melalui aliran dengan sangat mudah, saya sarankan through2 .
Untuk penanganan kesalahan, terus membaca.
pipa
Dalam rantai pipa, penanganan kesalahan memang tidak mudah. Menurut utas ini .pipe () tidak dibangun untuk meneruskan kesalahan. Jadi sesuatu seperti ...
var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});
... hanya akan mendengarkan kesalahan pada aliran c
. Jika acara kesalahan dipancarkan a
, itu tidak akan diturunkan dan, pada kenyataannya, akan melempar. Untuk melakukan ini dengan benar:
var a = createStream();
a.on('error', function(e){handleError(e)})
.pipe(b)
.on('error', function(e){handleError(e)})
.pipe(c)
.on('error', function(e){handleError(e)});
Sekarang, meskipun cara kedua lebih bertele-tele, Anda setidaknya bisa menjaga konteks di mana kesalahan Anda terjadi. Ini biasanya hal yang baik.
Satu perpustakaan saya menemukan membantu jika Anda memiliki kasus di mana Anda hanya ingin menangkap kesalahan di tempat tujuan dan Anda tidak begitu peduli tentang di mana itu terjadi adalah event-stream .
akhir
Ketika acara kesalahan dipecat, acara akhir tidak akan dipecat (secara eksplisit). Memancarkan peristiwa kesalahan akan mengakhiri aliran.
domain
Dalam pengalaman saya, sebagian besar domain berfungsi dengan sangat baik. Jika Anda memiliki peristiwa kesalahan yang tidak ditangani (yaitu memancarkan kesalahan pada aliran tanpa pendengar), server dapat macet. Sekarang, seperti yang ditunjukkan artikel di atas, Anda dapat membungkus aliran dalam domain yang seharusnya menangkap semua kesalahan.
var d = domain.create();
d.on('error', handleAllErrors);
d.run(function() {
fs.createReadStream(tarball)
.pipe(gzip.Gunzip())
.pipe(tar.Extract({ path: targetPath }))
.on('close', cb);
});
Keindahan domain adalah bahwa mereka akan melestarikan jejak tumpukan. Meskipun event-stream melakukan pekerjaan dengan baik juga.
Untuk bacaan lebih lanjut, lihat stream-handbook . Cukup mendalam, tetapi sangat berguna dan memberikan beberapa tautan bagus ke banyak modul bermanfaat.
Promise
kerangka kerja membuatnya lebih sederhana