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:
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:
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:
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:
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:
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.
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:
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:
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:
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对象则是可写流。

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.

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.

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

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 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.

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.

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.

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.


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

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

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
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
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)