‫-: Baiklah, sekarang mari kita benar-benar bekerja dengan stream.
‫Dan lagi, mulai dengan membuat file baru.
‫Baiklah. Sekarang katakanlah bahwa
‫untuk beberapa alasan dalam aplikasi kita, kita perlu membaca file teks
‫besar dari sistem file, dan kemudian mengirimkannya ke klien.
‫Jadi bagaimana kita melakukannya?
‫Ada banyak cara dan kita akan menjelajahi beberapa
‫di antaranya mulai dari yang paling
‫dasar dan terus berlanjut ke cara terbaik untuk melakukan ini.
‫Oke, jadi yang pertama adalah membutuhkan paket
‫sistem file seperti sebelumnya, dan juga modul HTTP.
‫Sekarang saya akan menunjukkan trik yang bagus, jadi
‫mari kita buat server seperti ini.
‫Jadi, membutuhkan paket HTTP, dan kemudian dari sini kita
‫bisa langsung memanggil createServer. Jadi seperti ini.
‫Oke, jadi hasil dari membutuhkan HTTP, adalah objek HTTP
‫dan di sana kita bisa menggunakan createServer.
‫Persis seperti ini, lalu simpan ke dalam variabel.
‫Jadi itu adalah cara lain untuk membuat server baru
‫dengan menulis kode yang lebih sedikit.
‫Oke dan seperti sebelumnya mari kita daftar ke acara
‫permintaan, dan tentukan panggilan balik kami di sini.
‫Jadi, solusi pertama yang akan kita gunakan
‫adalah yang termudah dan paling mudah.
‫Yaitu dengan hanya membaca file ke dalam variabel, dan
‫kemudian setelah selesai, kirimkan ke klien
‫dengan cara yang sudah kita ketahui cara melakukannya.
‫Jadi itu sangat sederhana, dan izinkan saya menulis
‫komentar di sini untuk itu. Jadi solusi
‫satu, dan fs. readFile lalu file pengujian kami lagi.
‫Dan kemudian setelah itu siap, kami memanggil fungsi panggilan balik kami
‫di mana kami memiliki akses ke data.
‫Tapi pertama-tama mari kita tangani kesalahannya.
‫Jadi misalnya jika file tersebut tidak ada, dan dalam hal
‫ini kita cukup mencatat kesalahan ke konsol.
‫Tetapi sebaliknya, kami hanya mengirim data ini kembali ke klien.
‫Jadi kami menggunakan objek respons seperti yang kami
‫lakukan sebelumnya berkali-kali, dan kemudian . akhir dan data.
‫Jadi, selamatkan, dan itu adalah solusi pertama
‫dan paling sederhana, bukan?
‫Tapi sebelum kita bisa menguji ini, kita juga
‫harus benar-benar memulai server, kan? Jadi kami menggunakan mendengarkan untuk melakukan itu.
‫Dan portnya, sama seperti sebelumnya, lalu localhost dan
‫fungsi callback kita.
‫Oke, jadi mari kita lihat apakah ini benar-benar berfungsi.
‫Dan tentu saja tidak, karena saya sebenarnya tidak
‫memulai aplikasi.
‫Jadi sekarang dikatakan mendengarkan, dan sekarang mari kita lihat apa
‫yang terjadi di sini.
‫Dan ini dia. Jadi file ini sangat
‫besar, memiliki Node.js. js adalah yang terbaik
‫yang ditulis di dalamnya seperti 10.000 kali atau sesuatu, jadi
‫butuh banyak waktu sampai dimuat seluruhnya. Dan kami tidak terlalu tertarik
‫untuk memuat semuanya, jadi mari hentikan ini di sini, dan
‫kembali ke kode kita. Jadi ini berfungsi dengan baik,
‫solusi yang kami miliki di sini dalam kasus ini,
‫tetapi masalahnya adalah bahwa dengan solusi ini,
‫node sebenarnya harus memuat seluruh file ke dalam
‫memori, karena hanya setelah itu siap, ia kemudian dapat
‫mengirim data itu . Sekarang ini adalah masalah ketika
‫file besar, dan juga ketika ada banyak permintaan yang masuk
‫ke server Anda. Karena proses
‫simpul akan sangat cepat kehabisan sumber daya dan aplikasi
‫Anda akan berhenti bekerja, semuanya akan macet, dan pengguna Anda
‫tidak akan senang, percayalah. Jadi solusi ini di
‫sini berfungsi ketika kita hanya membuat sesuatu yang
‫kecil secara lokal untuk diri kita sendiri, misalnya.
‫Tetapi dalam aplikasi siap produksi, Anda tidak dapat menggunakan
‫potongan kode seperti ini. Oke? Jadi mari kita beralih ke
‫solusi kedua kami. Dan dalam
‫solusi itu, kami benar-benar akan menggunakan stream.
‫Oke, jadi mari kita komentari bagian ini,
‫dan beralih ke solusi nomor dua.
‫Dan idenya di sini adalah bahwa
‫kita sebenarnya tidak perlu membaca data ini dari file menjadi variabel, bukan?
‫Kami tidak membutuhkan variabel ini. Jadi, alih-alih membaca
‫data ke dalam variabel, dan harus menyimpan variabel itu ke
‫dalam memori, kita hanya akan membuat aliran yang dapat dibaca.
‫Kemudian saat kami menerima setiap potongan data,
‫kami mengirimkannya ke klien sebagai
‫respons yang merupakan aliran yang dapat ditulis.
‫Sekarang izinkan saya menunjukkan kepada Anda bagaimana kita dapat menggunakan stream.
‫Jadi kami membuat variabel, sebut saja readable di sini, dan
‫kemudian dari sistem file lagi, kami menggunakan createReadStream
‫Kemudian ini tentu saja kecil. Dan sekarang nama file yang
‫kita coba baca. Jadi itu sekali lagi, file-test. txt.
‫Oke, sempurna. Jadi ini sekarang membuat aliran dari
‫data yang ada di file teks ini, yang kemudian dapat
‫kita konsumsi sepotong demi sepotong. Jadi potongan demi potongan.
‫Dan bagaimana kita melakukannya? Nah, ingat
‫dari kuliah terakhir, bahwa setiap kali ada bagian
‫data baru yang dapat kita konsumsi, aliran yang dapat
‫dibaca memancarkan peristiwa data. Oke, jadi kita bisa
‫menyimaknya, seperti yang kita pelajari di acara kuliah.
‫Sangat mudah dibaca. pada, data, dan kemudian fungsi panggilan balik kami.
‫Dan dalam fungsi panggilan balik kami, kami memiliki akses ke bagian
‫data itu, jadi ke bagian itu.
‫Biarkan saya menyebutnya chunk di sini dalam
‫fungsi callback kami dan sekarang kami dapat menangani bagian data ini.
‫Dan apa yang akan kita
‫lakukan dengan potongan data ini, dengan potongan ini, adalah untuk
‫benar-benar menulisnya ke aliran yang dapat ditulis, yang merupakan responsnya.
‫Jadi, res. menulis, potongan ini. Oke?
‫Jadi sekali lagi ingat bahwa respons ini adalah
‫aliran yang dapat ditulis. Jadi seperti yang saya
‫sebutkan di video sebelumnya, kan? Jadi sekarang kita dapat
‫menggunakan metode tulis untuk mengirim setiap bagian data ke dalam aliran itu.
‫Oke, dan dengan ini secara efektif
‫kami mengalirkan konten dari file langsung ke klien.
‫Oke, Anda mengerti perbedaannya?
‫Jadi sebelumnya, kami menulis semuanya sekaligus ke dalam variabel, dan
‫setelah itu siap, kami kemudian mengirim seluruh data itu
‫kembali ke klien. Tetapi dalam
‫situasi ini, dengan arus, itu berbeda.
‫Kami mengalirkan file secara efektif, jadi kami
‫membaca satu bagian file, dan segera
‫setelah itu tersedia, kami mengirimkannya langsung ke klien, menggunakan metode tulis
‫dari aliran respons. Kemudian ketika potongan
‫berikutnya tersedia maka potongan itu akan dikirim,
‫dan sampai seluruh file dibaca dan dialirkan ke klien.
‫Oke, jadi sekarang tinggal menyelesaikan, kita juga harus
‫menangani event ketika semua data sudah terbaca.
‫Jadi ketika streaming pada dasarnya selesai membaca data
‫dari file.
‫Jadi pada kasus itu, acara akhir akan dipancarkan,
‫dan segera setelah itu terjadi apa yang akan kita lakukan
‫adalah melakukan res. akhir, oke? Dan kami menggunakan
‫yang ini sebelumnya, jadi memanggil akhiri respons, kami melakukannya sebelumnya, kan?
‫Dan sekarang, sebenarnya lebih masuk akal, karena sekali lagi, responsnya
‫juga merupakan aliran, dan metode akhir memberi sinyal bahwa
‫tidak ada lagi data yang akan ditulis ke aliran
‫yang dapat ditulis ini, oke?
‫Jadi di sini yang kami lakukan hanyalah menggunakan res. diakhiri dengan data di
‫dalamnya. Jadi kami tidak melakukan
‫streaming, yang kami lakukan hanyalah mengirim beberapa data.
‫Sekarang dalam kasus ini, kami tidak
‫meneruskan apa pun ke metode akhir ini, karena kami sudah mengirim
‫semua data menggunakan res. menulis, potongan demi
‫potongan, dan ketika aliran yang dapat dibaca
‫selesai membaca filenya, yang harus kita lakukan adalah memberi sinyal
‫bahwa kita siap menggunakan res. berakhir seperti ini, oke?
‫Jadi kita selalu perlu menggunakan data ini dan acara akhir ini di sini satu
‫demi satu seperti ini. Karena jika
‫tidak, respon sebenarnya tidak akan pernah
‫benar-benar dikirim ke klien. Oke, jadi tanpa bagian ini
‫di sini, seluruh solusi ini tidak akan benar-benar berfungsi, oke?
‫Jadi sekarang mari kita tutup yang ini, mulai
‫lagi, dan baca lagi, dan jadi Anda melihat bahwa itu
‫benar-benar berfungsi lagi, oke? Sekarang kali ini tanpa masalah yang kami
‫miliki dengan solusi pertama. Mari kita hentikan ini di sini,
‫dan kembali ke kode kita, karena saya ingin
‫menunjukkan kepada Anda sekarang, bahwa ada peristiwa lain yang
‫dapat kita dengarkan di aliran yang dapat dibaca, yaitu peristiwa kesalahan.
‫Sangat mudah dibaca. on('error') dan dalam fungsi panggilan balik
‫ini kita memiliki akses ke objek kesalahan.
‫Oke jadi dalam hal ini kami akan mencatat kesalahan ini
‫ke konsol, dan kemudian mengirim hasil file tidak ditemukan.
‫Dan kita juga bisa mengatur kode status menjadi
‫error, jadi 500 misalnya. Jadi biasanya otomatis di
‫set ke 200 yang artinya oke, tapi dalam hal ini server
‫kita error, artinya kita ingin mengirim kembali kode 500.
‫Baiklah, jadi sekarang mari...
‫Sebenarnya saya harus berhenti ini lagi.
‫Jadi mari kita lihat apa yang terjadi sekarang.
‫Oh kita sudah memiliki kesalahan di
‫sini, res. status bukan fungsi. Dan
‫ya, sebenarnya statusCode-nya. Jadi begini cara
‫Anda menulisnya dalam express, jadi saya sudah terbiasa menulis begitu
‫banyak, jadi express adalah simpul. js framework yang akan kita gunakan
‫di sisa kursus dan
‫secara ekspres Anda melakukannya seperti ini, dan
‫itulah masalahnya. Jadi saya sudah agak terlalu
‫terbiasa menulis ekspres.
‫Jadi mari kita kembali, dan ya jadi sekarang kita melihat file tidak
‫ditemukan, dan jika kita membuka alat dev, Anda melihat 500 kode kesalahan yang baru saja
‫kita kirim sebelumnya, dan jika kita pergi ke tab jaringan, mari
‫kita coba lagi, Anda memiliki kode status di sini juga.
‫Jadi seperti yang kita lihat di salah satu video sebelumnya di
‫bagian lain sebenarnya. Jadi beginilah cara kami
‫memeriksa hal-hal semacam ini di tab jaringan.
‫Baiklah, jadi mari kita perbaiki di sini, simpan, dan oke
‫jadi ini bekerja dengan sempurna tetapi masih ada masalah dengan pendekatan
‫ini yang baru saja saya tunjukkan
‫kepada Anda. Dan masalahnya adalah
‫aliran kami yang dapat dibaca, jadi aliran
‫yang kami gunakan untuk membaca file dari disk, jauh lebih
‫cepat daripada mengirimkan hasilnya dengan aliran respons yang
‫dapat ditulis melalui jaringan. Dan ini akan membanjiri aliran
‫respons, yang tidak dapat menangani semua data yang masuk ini dengan begitu cepat.
‫Dan masalah ini disebut tekanan balik.
‫Dan itu adalah masalah nyata yang bisa terjadi dalam situasi nyata.
‫Jadi dalam kasus ini, tekanan balik terjadi ketika
‫respons tidak dapat mengirim data secepat yang diterimanya dari
‫file, apakah itu masuk akal?
‫Jadi kita harus memperbaiki solusi itu,
‫dan menghasilkan solusi yang lebih baik lagi.
‫Jadi, kami akan membuat solusi
‫tiga, dan itu sebenarnya
‫yang terakhir, Oke? Jadi tidak ada solusi lebih dari tiga.
‫Jadi rahasianya di sini adalah benar-benar menggunakan operator pipa yang
‫saya sebutkan di video terakhir, oke?
‫Jadi operator pipa tersedia di semua aliran yang dapat dibaca, dan ini
‫memungkinkan kita untuk menyalurkan output dari aliran yang
‫dapat dibaca langsung ke input aliran yang dapat ditulis, oke?
‫Dan itu kemudian akan memperbaiki masalah tekanan balik
‫karena secara otomatis akan menangani kecepatan pada
‫dasarnya data yang masuk, dan kecepatan data yang keluar.
‫Oke, jadi mari kita dapatkan aliran yang dapat dibaca di sini.
‫Oke, jadi itu adalah aliran yang dapat dibaca,
‫dan sekarang yang harus kita lakukan adalah mengambil aliran yang dapat
‫dibaca, menggunakan metode pipa di atasnya, dan kemudian memasukkan aliran yang dapat
‫ditulis dan itulah jawabannya. Dan itu sebenarnya.
‫Itu saja yang harus kita lakukan untuk solusi ini, oke?
‫Jadi selalu berfungsi seperti ini, izinkan
‫saya menulisnya di sini sebagai komentar. Jadi pada dasarnya kita membutuhkan sumber yang dapat
‫dibaca, oke jadi sekali lagi ini hanya untuk menjelaskannya kepada Anda,
‫kemudian kita dapat menggunakan pipa di atasnya, dan di sini
‫kita harus meletakkan tujuan yang dapat ditulis. Jadi, dari sinilah data kita
‫berasal, dan itu harus berupa aliran yang dapat
‫dibaca, dan data itu kemudian dapat kita salurkan ke tujuan yang dapat ditulis.
‫Jadi dalam hal ini tujuan kita adalah responnya, oke?
‫Sekarang aliran ini sebenarnya bisa menjadi aliran dupleks atau
‫transformasi juga, tetapi yang penting adalah kita dapat
‫menulis ke aliran. Dan respon tentu
‫saja adalah aliran seperti itu. Jadi kita tentu bisa
‫menulis ke respon yang akan dikirim ke klien, oke?
‫Jadi operator pipa secara otomatis memecahkan masalah
‫tekanan balik yang kami alami sebelumnya.
‫Dan ini juga merupakan solusi yang jauh
‫lebih elegan dan mudah. Jadi apa yang kami
‫lakukan di sini sebelumnya hanya untuk menunjukkan kepada
‫Anda semua cara di mana kami dapat menggunakan metode dan peristiwa aliran
‫untuk membuat solusi semacam ini dan tentu saja mereka
‫memiliki banyak kasus penggunaan, tetapi dalam masalah seperti ini, pipa
‫operator sebenarnya adalah solusi terbaik. Di balik layar sebenarnya ia melakukan sesuatu
‫seperti ini di sini, tetapi sekali
‫lagi dengan cara yang jauh lebih mudah bagi kita untuk
‫menulis, karena ia menangani semua hal secara
‫internal di belakang layar. Jadi saya percaya bahwa pipa
‫di sini sebenarnya adalah cara termudah untuk mengonsumsi dan menulis aliran,
‫kecuali tentu saja, seperti yang saya sebutkan, kami membutuhkan
‫solusi yang lebih khusus. Dan kemudian, kita harus
‫menggunakan alat yang lebih rumit ini seperti kejadian dan
‫metode yang saya tunjukkan sebelumnya. Baiklah, jadi untuk
‫menyelesaikannya, mari keluar dari proses di sini, mulai lagi, dan tentu
‫saja, lihat apakah itu masih berfungsi, yang berhasil.
‫Jadi, pekerjaan kita selesai di sini. Jadi kita sudah selesai dengan
‫kuliah ini, dan siap untuk langsung ke yang berikutnya.