


Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya)
Artikel ini akan memberi anda pemahaman terperinci tentang modul strim dalam Nodejs, dan memperkenalkan konsep dan penggunaan strim saya harap ia akan membantu semua orang.
modul strim ialah modul yang sangat teras dalam Nod Modul lain seperti fs, http, dsb. semuanya berdasarkan kejadian modul strim .
Bagi kebanyakan pemula front-end, apabila mereka mula-mula mula menggunakan Node, mereka masih tidak mempunyai pemahaman yang jelas tentang konsep dan penggunaan strim, kerana nampaknya terdapat sangat sedikit tentang "strim" dalam kerja bahagian hadapan Mengendalikan aplikasi berkaitan.
1. Aliran, apakah itu?
Dengan perkataan "aliran" sahaja, kita boleh dengan mudah mempunyai konsep aliran air, aliran, dsb.
Takrifan rasmi: Strim ialah antara muka abstrak untuk memproses data aliran dalam Node.js
Daripada takrifan rasmi, kita boleh lihat:
- Stream ialah alat yang disediakan oleh Node untuk memproses data
- Stream ialah antara muka abstrak dalam Node
Pemahaman aliran yang tepat, Ia boleh difahami sebagai 数据流
, iaitu satu cara untuk menghantar data Dalam aplikasi, aliran adalah aliran data yang teratur dengan titik permulaan dan titik akhir.
Sebab utama mengapa kami tidak memahami aliran dengan baik ialah ia adalah konsep abstrak.
2. Senario penggunaan strim khusus
Untuk kami memahami dengan jelas modul strim, kami terlebih dahulu menerangkan aplikasi praktikal modul strim dengan senario aplikasi tertentu.
strim, dalam Node, digunakan terutamanya untuk 大量数据
keperluan pemprosesan, seperti fs membaca dan menulis fail besar, respons permintaan http, pemampatan fail, penyulitan/penyahsulitan data dan aplikasi lain .
Kami menggunakan gambar di atas untuk menggambarkan penggunaan aliran baldi boleh difahami sebagai 数据源
, kolam boleh difahami sebagai 数据目标
, dan paip. disambungkan di tengah boleh difahami sebagai 数据流
, melalui 数据流管道
, data mengalir dari sumber data ke sasaran data.
3. Klasifikasi strim
Dalam Nod, strim dibahagikan kepada 4 kategori: strim boleh dibaca, strim boleh tulis, strim dupleks dan strim penukaran.
-
Writable
: Strim ke mana data boleh ditulis -
Readable
: Strim ke mana data boleh dimasukkan baca -
Duplex
: AliranReadable
danWritable
-
Transform
: boleh diubah suai semasa menulis dan membaca data atauDuplex
strim yang mengubah data
Semua strim ialah tika EventEmitter
. Iaitu, kita boleh memantau perubahan dalam aliran data melalui mekanisme acara.
4. Mod data dan kawasan penimbal
Sebelum mempelajari penggunaan khusus 4 jenis aliran, kita perlu memahami dua konsep 数据模式
dan 缓存区
, yang akan membantu kita dalam langkah seterusnya. Pemahaman yang lebih baik melalui pembelajaran hiliran.
4.1 Mod Data
Semua strim yang dibuat oleh Node.js API hanya untuk 字符串
dan Buffer
(atau Uint8Array
) objek untuk beroperasi.
4.2 Penampan
Writable
dan Readable
menstrim kedua-dua menyimpan data dalam penimbal dalaman.
Jumlah data yang boleh ditimbal bergantung pada pilihan highWaterMark
yang dihantar kepada pembina strim Untuk strim biasa, pilihan highWaterMark
menentukan 字节的总数
untuk strim yang beroperasi dalam mod objek, pilihan highWaterMark
menentukan Jumlah bilangan objek. Pilihan
highWaterMark
ialah ambang, bukan had: ia menentukan jumlah data yang ditampan oleh strim sebelum ia berhenti meminta lebih banyak data.
Apabila pelaksanaan memanggil stream.push(chunk)
, data dicache dalam strim Readable
. Jika pengguna strim tidak memanggil stream.read()
, data akan kekal dalam baris gilir dalaman sehingga digunakan.
Setelah jumlah saiz penimbal bacaan dalaman mencapai ambang yang ditentukan oleh highWaterMark
strim akan menghentikan sementara membaca data daripada sumber asas sehingga data yang ditimbal pada masa ini boleh digunakan
Apabila diulang Apabila memanggil kaedah writable.write(chunk)
, data akan dicache dalam strim Writable
.
5. Strim boleh dibaca
5.1 Aliran dan jeda bacaan strim
Readable
Terdapat dua jenis aliran Berkesan beroperasi dalam salah satu mod: aliran dan jeda.
Mod aliran: Baca data dari lapisan bawah sistem dan tolak() ke kawasan cache Selepas mencapai highWaterMark, push() akan mengembalikan palsu, dan sumber akan berhenti mengalir ke kawasan cache, dan penggunaan peristiwa data akan dicetuskan.
Mod Jeda: Semua strim Boleh Baca bermula dalam mod Jeda Dijeda dan kaedah stream.read() mesti dipanggil secara eksplisit untuk membaca data daripada strim. Setiap kali data mencapai kawasan penimbal, peristiwa boleh dibaca akan dicetuskan, iaitu, setiap push() akan mencetuskan boleh dibaca.
-
Cara menukar daripada mod jeda kepada mod aliran:
- Tambah pengendali acara data
- Panggil kaedah stream.resume()
- Panggil kaedah stream.pipe() untuk menghantar data ke Boleh Tulis
-
Cara menukar mod aliran kepada mod jeda:
- Jika bukan sasaran Saluran Paip, dengan memanggil kaedah stream.pause().
- Padam semua sasaran saluran paip jika ada. Sasaran saluran paip berbilang boleh dialih keluar dengan memanggil kaedah stream.unpipe().
5.2 Contoh biasa strim boleh dibaca
import path from 'path'; import fs, { read } from 'fs'; const filePath = path.join(path.resolve(), 'files', 'text.txt'); const readable = fs.createReadStream(filePath); // 如果使用 readable.setEncoding() 方法为流指定了默认编码,则监听器回调将把数据块作为字符串传入;否则数据将作为 Buffer 传入。 readable.setEncoding('utf8'); let str = ''; readable.on('open', (fd) => { console.log('开始读取文件') }) // 每当流将数据块的所有权移交给消费者时,则会触发 'data' 事件 readable.on('data', (data) => { str += data; console.log('读取到数据') }) // 方法将导致处于流动模式的流停止触发 'data' 事件,切换到暂停模式。 任何可用的数据都将保留在内部缓冲区中。 readable.pause(); // 方法使被显式暂停的 Readable 流恢复触发 'data' 事件,将流切换到流动模式。 readable.resume(); // 当调用 stream.pause() 并且 readableFlowing 不是 false 时,则会触发 'pause' 事件。 readable.on('pause', () => { console.log('读取暂停') }) // 当调用 stream.resume() 并且 readableFlowing 不是 true 时,则会触发 'resume' 事件。 readable.on('resume', () => { console.log('重新流动') }) // 当流中没有更多数据可供消费时,则会触发 'end' 事件。 readable.on('end', () => { console.log('文件读取完毕'); }) // 当流及其任何底层资源(例如文件描述符)已关闭时,则会触发 'close' 事件。 readable.on('close', () => { console.log('关闭文件读取') }) // 将 destWritable 流绑定到 readable,使其自动切换到流动模式并将其所有数据推送到绑定的 Writable。 数据流将被自动管理 readable.pipe(destWriteable) // 如果底层流由于底层内部故障而无法生成数据,或者当流实现尝试推送无效数据块时,可能会发生这种情况。 readable.on('error', (err) => { console.log(err) console.log('文件读取发生错误') })
6 🎜>
6.1 Aliran dan penggantungan strim boleh tulis Strim boleh tulis adalah serupa dengan strim boleh dibaca Apabila data mengalir, ia akan ditulis terus ke Kawasan cache, apabila kelajuan menulis perlahan atau penulisan digantung, aliran data akan dicache di kawasan penimbal
Apabila pengeluar menulis terlalu cepat dan mengisi kolam baris gilir, ia akan muncul. Tekanan belakang", pada masa ini, anda perlu memberitahu pengeluar untuk menggantung pengeluaran. Apabila baris gilir dilepaskan, strim boleh tulis akan menghantar mesej longkang kepada pengeluar untuk menyambung semula pengeluaran.
6.2 Contoh Strim Boleh Tulis
Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:import path from 'path'; import fs, { read } from 'fs'; const filePath = path.join(path.resolve(), 'files', 'text.txt'); const copyFile = path.join(path.resolve(), 'files', 'copy.txt'); let str = ''; // 创建可读流 const readable = fs.createReadStream(filePath); // 如果使用 readable.setEncoding() 方法为流指定了默认编码 readable.setEncoding('utf8'); // 创建可写流 const wirteable = fs.createWriteStream(copyFile); // 编码 wirteable.setDefaultEncoding('utf8'); readable.on('open', (fd) => { console.log('开始读取文件') }) // 每当流将数据块的所有权移交给消费者时,则会触发 'data' 事件 readable.on('data', (data) => { str += data; console.log('读取到数据'); // 写入 wirteable.write(data, 'utf8'); }) wirteable.on('open', () => { console.log('开始写入数据') }) // 如果对 stream.write(chunk) 的调用返回 false,则 'drain' 事件将在适合继续将数据写入流时触发。 // 即生产数据的速度大于写入速度,缓存区装满之后,会暂停生产着从底层读取数据 // writeable缓存区释放之后,会发送一个drain事件让生产者继续读取 wirteable.on('drain', () => { console.log('继续写入') }) // 在调用 stream.end() 方法之后,并且所有数据都已刷新到底层系统,则触发 'finish' 事件。 wirteable.on('finish', () => { console.log('数据写入完毕') }) readable.on('end', () => { // 数据读取完毕通知可写流 wirteable.end() }) // 当在可读流上调用 stream.pipe() 方法将此可写流添加到其目标集时,则触发 'pipe' 事件。 // readable.pipe(destWriteable) wirteable.on('pipe', () => { console.log('管道流创建') }) wirteable.on('error', () => { console.log('数据写入发生错误') })
Atas ialah kandungan terperinci Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Node.js ialah masa jalan JavaScript bahagian pelayan, manakala Vue.js ialah rangka kerja JavaScript sisi klien untuk mencipta antara muka pengguna interaktif. Node.js digunakan untuk pembangunan bahagian pelayan, seperti pembangunan API perkhidmatan belakang dan pemprosesan data, manakala Vue.js digunakan untuk pembangunan sisi klien, seperti aplikasi satu halaman dan antara muka pengguna yang responsif.

Node.js boleh digunakan sebagai rangka kerja bahagian belakang kerana ia menawarkan ciri seperti prestasi tinggi, kebolehskalaan, sokongan merentas platform, ekosistem yang kaya dan kemudahan pembangunan.

Untuk menyambung ke pangkalan data MySQL, anda perlu mengikuti langkah berikut: Pasang pemacu mysql2. Gunakan mysql2.createConnection() untuk mencipta objek sambungan yang mengandungi alamat hos, port, nama pengguna, kata laluan dan nama pangkalan data. Gunakan connection.query() untuk melaksanakan pertanyaan. Akhir sekali gunakan connection.end() untuk menamatkan sambungan.

Pembolehubah global berikut wujud dalam Node.js: Objek global: modul Teras global: proses, konsol, memerlukan pembolehubah persekitaran Runtime: __dirname, __filename, __line, __column Constants: undefined, null, NaN, Infinity, -Infinity

Terdapat dua fail berkaitan npm dalam direktori pemasangan Node.js: npm dan npm.cmd Perbezaannya adalah seperti berikut: sambungan berbeza: npm ialah fail boleh laku dan npm.cmd ialah pintasan tetingkap arahan. Pengguna Windows: npm.cmd boleh digunakan daripada command prompt, npm hanya boleh dijalankan dari baris arahan. Keserasian: npm.cmd adalah khusus untuk sistem Windows, npm tersedia merentas platform. Cadangan penggunaan: Pengguna Windows menggunakan npm.cmd, sistem pengendalian lain menggunakan npm.

Perbezaan utama antara Node.js dan Java ialah reka bentuk dan ciri: Didorong peristiwa vs. didorong benang: Node.js dipacu peristiwa dan Java dipacu benang. Satu-benang vs. berbilang benang: Node.js menggunakan gelung acara satu-benang dan Java menggunakan seni bina berbilang benang. Persekitaran masa jalan: Node.js berjalan pada enjin JavaScript V8, manakala Java berjalan pada JVM. Sintaks: Node.js menggunakan sintaks JavaScript, manakala Java menggunakan sintaks Java. Tujuan: Node.js sesuai untuk tugas intensif I/O, manakala Java sesuai untuk aplikasi perusahaan besar.

Ya, Node.js ialah bahasa pembangunan bahagian belakang. Ia digunakan untuk pembangunan bahagian belakang, termasuk mengendalikan logik perniagaan sebelah pelayan, mengurus sambungan pangkalan data dan menyediakan API.

Node.js dan Java masing-masing mempunyai kebaikan dan keburukan dalam pembangunan web, dan pilihan bergantung pada keperluan projek. Node.js cemerlang dalam aplikasi masa nyata, pembangunan pesat dan seni bina perkhidmatan mikro, manakala Java cemerlang dalam sokongan, prestasi dan keselamatan gred perusahaan.
