Rumah >hujung hadapan web >tutorial js >Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya)

Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya)

青灯夜游
青灯夜游ke hadapan
2021-12-20 11:13:082326semak imbas

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.

Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya)

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 .

Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya)

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: Aliran Readable dan Writable
  • Transform: boleh diubah suai semasa menulis dan membaca data atau Duplex 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('数据写入发生错误')
})
tutorial nodejs

! !

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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam