Node.js secara alami asinkron dan digerakkan oleh peristiwa, dan sangat ideal untuk menangani tugas terkait I/O. Jika Anda berurusan dengan operasi terkait I/O di aplikasi Anda, Anda dapat memanfaatkan aliran di Node.js. Oleh karena itu, mari kita lihat aliran secara detail dan pahami bagaimana mereka menyederhanakan operasi I/O.
Apa itu aliran
Stream adalah pipa Unix yang memungkinkan Anda untuk dengan mudah membaca data dari sumber data dan kemudian mengalir ke tujuan lain.
Sederhananya, streaming bukanlah sesuatu yang istimewa, itu hanya Eventemitter yang mengimplementasikan beberapa metode. Menurut metode yang diterapkannya, aliran dapat menjadi aliran yang dapat dibaca (dapat dibaca), aliran yang dapat ditulis (writable), atau aliran dua arah (dupleks, dapat dibaca dan dapat ditulis).
Aliran yang dapat dibaca memungkinkan Anda membaca data dari sumber data, sementara aliran yang dapat ditulis memungkinkan Anda untuk menulis data ke tujuan Anda.
Jika Anda menggunakan Node.js, Anda kemungkinan akan menemukan streaming.
Misalnya, di server http node.js, permintaan adalah aliran yang dapat dibaca dan respons adalah aliran yang dapat ditulis.
Anda mungkin juga menggunakan modul FS, yang dapat membantu Anda menangani aliran yang dapat dibaca dan dapat ditulis.
Sekarang izinkan Anda mempelajari beberapa dasar dan memahami berbagai jenis aliran. Artikel ini akan membahas aliran yang dapat dibaca dan dapat ditulis. Aliran dua arah berada di luar cakupan artikel ini dan kami tidak akan membahasnya.
Aliran yang dapat dibaca
Kita dapat menggunakan aliran yang dapat dibaca untuk membaca data dari sumber data, yang dapat berupa apa saja, seperti file dalam sistem, buffer dalam memori, atau bahkan aliran lainnya. Karena stream adalah EventeMitters, mereka mengirim data dengan berbagai acara. Kami akan menggunakan acara ini untuk membuat aliran bekerja.
Baca Data dari Stream
Cara terbaik untuk membaca data dari aliran adalah dengan mendengarkan acara data dan menambahkan fungsi panggilan balik. Ketika data mengalir, aliran yang dapat dibaca akan mengirim acara data dan fungsi callback akan dipicu. Lihatlah cuplikan kode berikut:
var fs = membutuhkan ('fs'); var readableStream = fs.createreadStream ('file.txt'); var data = ''; var readableStream.on ('data', function (chunk) {data += chunk;}); readableStream.on ('end', function () {console.log (data);fs.createreadstream akan memberi Anda aliran yang dapat dibaca.
Pada awalnya, aliran ini tidak dinamis aliran. Saat Anda menambahkan pendengar acara data dan menambahkan fungsi panggilan balik, itu akan mengalir. Setelah ini, itu akan membaca sepotong kecil data dan meneruskannya ke fungsi panggilan balik Anda.
Pelaksana aliran menentukan frekuensi pemicu acara data. Misalnya, permintaan HTTP akan memicu acara data ketika beberapa KB data dibaca. Saat Anda membaca data dari file, Anda dapat memutuskan untuk memicu acara data saat saluran selesai.
Ketika tidak ada data untuk dibaca (saat dibaca di akhir file), aliran akan mengirim acara akhir. Dalam contoh di atas, kami mendengarkan acara ini dan mencetak data ketika kami selesai membaca file.
Ada cara lain untuk membaca aliran. Anda hanya perlu terus memanggil metode baca () dalam instance stream sebelum membaca ke akhir file.
var fs = membutuhkan ('fs'); var readableStream = fs.createreadStream ('file.txt'); var data = ''; var chunk; readableStream.on ('readable', function () {while ((chunk = readableStream.read ())! = null) {data += chunk;}} (};} (};} (};} ({oDableAm. console.log (data);});Metode baca () membaca data dari buffer internal, dan mengembalikan nol ketika tidak ada data untuk dibaca.
Oleh karena itu, dalam loop while kami memeriksa apakah baca () mengembalikan nol, dan ketika mengembalikan nol, loop akan diakhiri.
Perlu dicatat bahwa ketika kita dapat membaca data dari aliran, acara yang dapat dibaca akan dipecat.
Atur encoding
Secara default, apa yang Anda baca dari aliran adalah objek buffer. Jika Anda membaca string, ini bukan untuk Anda. Oleh karena itu, Anda dapat mengatur pengkodean aliran dengan memanggil readable.setencoding () seperti dalam contoh berikut:
var fs = membutuhkan ('fs'); var readableStream = fs.createreadStream ('file.txt'); var data = ''; readableStream.setencoding ('utf8'); readablestream.on ('data', function (chunk) {data += chunk;Dalam contoh di atas, jika kita mengatur pengkodean aliran ke UTF8, data akan diuraikan ke UTF8, dan potongan dalam fungsi callback akan menjadi string.
Perpipaan
Pipa adalah mekanisme yang bagus di mana Anda dapat membaca data dari sumber data tanpa mengelola keadaan sendiri dan menulisnya ke tujuan Anda. Mari kita lihat contoh berikut:
var fs = membutuhkan ('fs'); var readableStream = fs.createreadStream ('file1.txt'); var writableStream = fs.createWritestream ('file2.txt'); readableStream.pipe (writableStream);Contoh di atas menggunakan metode pipa () untuk menulis konten file1 ke file2. Karena pipa () akan membantu Anda mengelola aliran data, Anda tidak perlu khawatir tentang kecepatan aliran data. Ini membuat pipa () sangat sederhana dan mudah digunakan.
Perlu dicatat bahwa pipa () mengembalikan aliran tujuan, sehingga Anda dapat dengan mudah menautkan beberapa aliran!
Tautan (rantai)
Misalkan ada file arsip dan Anda ingin membuka ritsletingnya. Ada banyak cara untuk menyelesaikan tugas ini. Tetapi cara paling sederhana adalah dengan menggunakan saluran pipa dan tautan:
var fs = membutuhkan ('fs'); var zlib = membutuhkan ('zlib'); fs.createreadStream ('input.txt.gz') .pipe (zlib.createGunzip ()) .pipe (fs.createWriteStream ('output.txt')));Pertama, kami membuat aliran yang dapat dibaca melalui input.txt.gz dan kemudian membiarkannya mengalirkan aliran zlib.creategunzip (), yang mendekompresi konten. Akhirnya, kami menambahkan aliran yang dapat ditulis untuk menulis konten yang didekompresi ke file lain.
Metode lain
Kami telah membahas beberapa konsep penting dalam aliran yang dapat dibaca, dan berikut adalah beberapa cara yang perlu Anda ketahui:
1. dibaca.Pause () Metode ini akan menjeda aliran aliran. Dengan kata lain, itu tidak akan memicu acara data lagi.
2. dibaca. Metode () adalah kebalikan dari yang di atas dan akan memungkinkan aliran jeda untuk melanjutkan aliran.
3.Readable.unpipe () Metode akan menghapus tujuan. Jika ada parameter yang dilewati, itu akan membiarkan aliran yang dapat dibaca menghentikan tujuan spesifik Liu Xiang, jika tidak maka akan menghapus semua tujuan.
Aliran yang dapat ditulis
Aliran yang dapat ditulis memungkinkan Anda untuk menulis data ke tujuan Anda. Sama seperti aliran yang dapat dibaca, ini adalah EventeMitters, dan mereka juga memicu berbagai peristiwa. Mari kita lihat peristiwa dan metode yang akan dipicu dalam aliran yang dapat ditulis.
Tulis untuk streaming
Untuk menulis data sebagai aliran yang dapat ditulis, Anda perlu memanggil metode write () dalam instance aliran yang dapat ditulis, dan lihat contoh berikut:
var fs = membutuhkan ('fs'); var readableStream = fs.createreadStream ('file1.txt'); var writableStream = fs.createWritestream ('file2.txt'); readableStream.setencoding ('utf8'); readablestream.on ('data', function (chunk) {'wrunk) {'); wrunked 'wroKeStream.on (function', function (function) {{{{{'wrunkeReMeM.Kode di atas sangat sederhana, hanya membaca data dari aliran input dan menulisnya ke tujuan dengan write ().
Metode ini mengembalikan nilai boolean untuk menunjukkan apakah penulisan berhasil. Jika yang dikembalikan benar, itu berarti bahwa penulisan berhasil dan Anda dapat terus menulis lebih banyak data. Jika salah, itu berarti sesuatu terjadi kesalahan dan Anda tidak dapat terus menulis sekarang. Aliran yang dapat ditulis memicu acara pembuangan untuk memberi tahu Anda bahwa Anda dapat terus menulis data.
Setelah menulis data
Ketika Anda tidak perlu menulis data, Anda dapat menghubungi metode akhir () untuk memberi tahu aliran yang telah Anda selesaikan. Dengan asumsi res adalah objek respons HTTP, Anda biasanya akan mengirim respons ke browser:
res.write ('beberapa data !!');
res.end ();
Ketika akhir () dipanggil, semua data ditulis dan aliran kemudian akan memicu acara selesai. Perhatikan bahwa setelah panggilan akhir (), Anda tidak dapat lagi menulis data ke dalam aliran yang dapat ditulis. Misalnya, kode berikut akan melaporkan kesalahan:
res.write ('beberapa data !!');
res.end ();
res.write ('mencoba menulis lagi'); // kesalahan!
Berikut adalah beberapa acara penting yang terkait dengan aliran yang dapat ditulis:
1.ROR TERBANGKAKAN Saat kesalahan terjadi secara tertulis atau menghubungkan
2.Pipkan saat aliran yang dapat dibaca ditautkan ke aliran yang dapat ditulis, acara ini akan memicu
3. Unripe akan menembak saat unpip dipanggil dengan aliran yang dapat dibaca
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.