cari
Rumahhujung hadapan webtutorial jsNode kajian Nodejs Strim module_node.js

1, analisis pembukaan

Strim ialah antara muka abstrak yang dilaksanakan oleh banyak objek dalam Node. Sebagai contoh, permintaan kepada pelayan HTTP ialah strim, dan stdout juga merupakan strim. Strim boleh dibaca, boleh ditulis atau kedua-duanya.

Pendedahan terawal kepada Strim bermula pada hari-hari awal pengamalan Unix selama beberapa dekad telah membuktikan bahawa idea Strim boleh membangunkan beberapa sistem yang besar dengan mudah.

Dalam Unix, Stream dilaksanakan melalui "|". Dalam nod, sebagai modul strim terbina dalam, banyak modul teras dan modul pihak ketiga digunakan.

Seperti Unix, operasi utama aliran nod juga ialah .pipe().

Strim boleh menyediakan pembangun antara muka bersatu yang boleh digunakan semula dan mengawal keseimbangan baca dan tulis antara strim melalui antara muka Strim abstrak.

Sambungan TCP ialah strim boleh dibaca dan strim boleh tulis, manakala sambungan HTTP adalah berbeza Objek permintaan http ialah strim boleh dibaca dan objek tindak balas http ialah strim boleh ditulis.

Proses penghantaran strim dihantar dalam bentuk penimbal secara lalai, melainkan anda menetapkan kaedah pengekodan lain untuknya. Berikut ialah contoh:

Salin kod Kod adalah seperti berikut:

var http = memerlukan('http') ;
pelayan var = http.createServer(function(req,res){
res.writeHeader(200, {'Content-Type': 'text/plain'}) ;
res.end("Hello, Beruang Besar!") ;
}) ;
server.listen(8888) ;
console.log("Pelayan http berjalan pada port 8888...") ;

Aksara bercelaru akan muncul selepas dijalankan Sebabnya ialah set aksara yang ditentukan tidak ditetapkan, seperti: "utf-8".

Hanya ubah suai:

Salin kod Kod adalah seperti berikut:

var http = memerlukan('http') ;
pelayan var = http.createServer(function(req,res){
res.writeHeader(200,{
         'Content-Type' : 'text/plain;charset=utf-8' // Tambah charset=utf-8
}) ;
res.end("Hello, Beruang Besar!") ;
}) ;
server.listen(8888) ;
console.log("Pelayan http berjalan pada port 8888 ...") ;

Hasil jalankan:

Mengapa menggunakan Strim
I/O dalam nod adalah tak segerak, jadi membaca dan menulis ke cakera dan rangkaian memerlukan fungsi panggil balik untuk membaca data Berikut ialah contoh muat turun fail
Kod di atas:

Salin kod Kod adalah seperti berikut:

var http = memerlukan('http') ;
var fs = memerlukan('fs') ;
pelayan var = http.createServer(fungsi (req, res) {
fs.readFile(__dirname '/data.txt', fungsi (err, data) {
           res.end(data);
}) ;
}) ;
server.listen(8888) ;

Kod boleh mencapai fungsi yang diperlukan, tetapi perkhidmatan perlu menyimpan keseluruhan data fail ke dalam memori sebelum menghantar data fail Jika fail "data.txt" sangat besar
Jika ia besar dan jumlah concurrency adalah besar, banyak memori akan terbuang. Kerana pengguna perlu menunggu sehingga keseluruhan fail dicache dalam memori sebelum menerima data fail, ini menghasilkan
Pengalaman pengguna agak teruk. Nasib baik, kedua-dua parameter (req, res) ialah Strim, jadi kita boleh menggunakan fs.createReadStream() dan bukannya fs.readFile(). Seperti berikut:

Salin kod Kod adalah seperti berikut:

var http = memerlukan('http') ;
var fs = memerlukan('fs') ;
pelayan var = http.createServer(fungsi (req, res) {
var stream = fs.createReadStream(__dirname '/data.txt') ;
Stream.pipe(res) ;
}) ;
server.listen(8888) ;

Kaedah.pipe() mendengar peristiwa 'data' dan 'end' fs.createReadStream(), supaya fail "data.txt" tidak perlu dicache secara keseluruhannya
fail, blok data boleh dihantar kepada klien serta-merta selepas sambungan klien selesai. Satu lagi faedah menggunakan .pipe() ialah ia boleh menyelesaikan masalah apabila pelanggan
Masalah ketidakseimbangan baca-tulis disebabkan oleh kependaman hujung ke hujung yang sangat besar.

Terdapat lima Strim asas: boleh dibaca, boleh ditulis, diubah, dupleks dan "klasik". (Sila semak API untuk penggunaan khusus)

2. Pengenalan contoh

Apabila data yang perlu diproses tidak dapat dimuatkan dalam memori pada satu masa, atau apabila ia lebih cekap untuk membaca dan memproses pada masa yang sama, kita perlu menggunakan aliran data. NodeJS menyediakan operasi pada aliran data melalui pelbagai Aliran.

Mengambil program penyalinan fail besar sebagai contoh, kami boleh mencipta strim data baca sahaja untuk sumber data Contohnya adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

var rs = fs.createReadStream(pathname);
rs.on('data', fungsi (chunk) {
doSomething(chunk); // Jangan ragu untuk bermain dengan butiran
});
rs.on('end', function () {
       cleanUp() ;
}) ;

Peristiwa data dalam kod akan dicetuskan secara berterusan, tidak kira sama ada fungsi doSomething boleh mengendalikannya. Kod boleh terus diubah suai seperti berikut untuk menyelesaikan masalah ini.

Salin kod Kod adalah seperti berikut:

var rs = fs.createReadStream(src) ;
rs.on('data', fungsi (chunk) {
​ rs.pause() ;
doSomething(chunk, function () {
          rs.resume() ;
}) ;
}) ;
rs.on('end', function () {
       cleanUp();
}) ;

Panggilan balik ditambahkan pada fungsi doSomething supaya kami boleh menjeda bacaan data sebelum memproses data dan meneruskan membaca data selepas memproses data.

Selain itu, kami juga boleh mencipta aliran data tulis sahaja untuk sasaran data, seperti berikut:

Salin kod Kod adalah seperti berikut:

var rs = fs.createReadStream(src) ;
var ws = fs.createWriteStream(dst) ;
rs.on('data', fungsi (chunk) {
            ws.write(chunk);
}) ;
rs.on('end', function () {
          ws.end();
}) ;

Selepas doSomething digantikan dengan menulis data ke dalam aliran data tulis sahaja, kod di atas kelihatan seperti program penyalinan fail. Walau bagaimanapun, kod di atas mempunyai masalah yang dinyatakan di atas Jika kelajuan menulis tidak dapat bersaing dengan kelajuan membaca, cache dalam aliran data tulis sahaja akan pecah. Kami boleh menggunakan nilai pulangan kaedah .write untuk menentukan sama ada data masuk ditulis kepada sasaran atau diletakkan sementara dalam cache dan berdasarkan peristiwa longkang, kami boleh menentukan apabila aliran data tulis sahaja telah menulis data dalam cache ke sasaran , data seterusnya yang akan ditulis boleh dihantar masuk. Jadi kodnya adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

var rs = fs.createReadStream(src) ;
var ws = fs.createWriteStream(dst) ;
rs.on('data', fungsi (chunk) {
Jika (ws.write(chunk) === palsu) {
          rs.pause() ;
}
}) ;
rs.on('end', function () {
          ws.end();
});
ws.on('longkang', fungsi () {
​ rs.resume();
}) ;

Akhirnya menyedari pemindahan data daripada aliran data baca sahaja kepada aliran data tulis sahaja, dan termasuk kawalan gudang kalis letupan. Oleh kerana terdapat banyak senario penggunaan untuk ini, seperti program penyalinan fail besar di atas, NodeJS secara langsung menyediakan kaedah .pipe untuk melakukan ini dan pelaksanaan dalamannya adalah serupa dengan kod di atas.

Berikut ialah proses menyalin fail yang lebih lengkap:

Salin kod Kod adalah seperti berikut:

var fs = memerlukan('fs'),
  laluan = memerlukan('path'),
  keluar = process.stdout;
var filePath = '/bb/bigbear.mkv';
var readStream = fs.createReadStream(filePath);
var writeStream = fs.createWriteStream('file.mkv');
var stat = fs.statSync(filePath);
var totalSize = stat.size;
var passedLength = 0;
var lastSize = 0;
var startTime = Date.now();
readStream.on('data', function(chunk) {
  passedLength = ketul.panjang;
  if (writeStream.write(chunk) === false) {
    readStream.pause();
  }
});
readStream.on('end', function() {
  writeStream.end();
});
writeStream.on('drain', function() {
  readStream.resume();
});
setTimeout(function show() {
  var peratus = Math.ceil((passedLength / totalSize) * 100);
  saiz var = Math.ceil(passedLength / 1000000);
  var diff = saiz - lastSize;
  lastSize = saiz;
  out.clearLine();
  out.cursorTo(0);
  out.write('已完成' saiz 'MB, ' peratus '%, 速度:' diff * 2 'MB/s');
  jika (melepasiPanjang     setTimeout(tunjukkan, 500);
  } lain {
    var endTime = Date.now();
    console.log();
    console.log('共用时:' (masa tamat - masa mula) / 1000 '秒。');
  }
}, 500);

可以把上面的代码保存为 "copy.js" 试验一下我们添加了一个递归的 setTimeout (戴睔掅set(戴睔厅set一个旁观者,

每500ms观察一次完成进度,并把已完成的大小、百分比和复制速度一并把已完成的大小、百分比和复制速度一尶厙制小完成时,计算总的耗费时间。

三,总结一下

(1),理解Stream概念。

(2),熟练使用相关Strim的api

(3),注意细节的把控,比如:大文件的拷贝,采用的使用 “data cebisan” 的形式进行分片。

(4),paip的使用

(5),再次强调一个概念:一个TCP连接既是可读流,又是可写流,而Http吿中心中可一接是可读流,而http respon对象则是可写流。

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Enjin JavaScript: Membandingkan PelaksanaanEnjin JavaScript: Membandingkan PelaksanaanApr 13, 2025 am 12:05 AM

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Beyond the Browser: JavaScript di dunia nyataBeyond the Browser: JavaScript di dunia nyataApr 12, 2025 am 12:06 AM

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Apr 11, 2025 am 08:23 AM

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Apr 11, 2025 am 08:22 AM

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

JavaScript: meneroka serba boleh bahasa webJavaScript: meneroka serba boleh bahasa webApr 11, 2025 am 12:01 AM

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Evolusi JavaScript: Trend Semasa dan Prospek Masa DepanEvolusi JavaScript: Trend Semasa dan Prospek Masa DepanApr 10, 2025 am 09:33 AM

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

Demystifying JavaScript: Apa yang berlaku dan mengapa pentingDemystifying JavaScript: Apa yang berlaku dan mengapa pentingApr 09, 2025 am 12:07 AM

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Adakah Python atau JavaScript lebih baik?Adakah Python atau JavaScript lebih baik?Apr 06, 2025 am 12:14 AM

Python lebih sesuai untuk sains data dan pembelajaran mesin, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya, dan sesuai untuk analisis data dan pembangunan web. 2. JavaScript adalah teras pembangunan front-end. Node.js menyokong pengaturcaraan sisi pelayan dan sesuai untuk pembangunan stack penuh.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)