Rumah >hujung hadapan web >tutorial js >Cara Menggunakan Acara Server-Sent di Node.js
mata teras
Kelebihan Acara Pengiriman Server
Web bertindak balas terhadap mesej HTTP berdasarkan permintaan-tindak balas. Pelayar anda mengeluarkan permintaan URL dan pelayan mengembalikan data. Ini boleh menyebabkan penyemak imbas membuat lebih banyak permintaan kepada imej, CSS, JavaScript, dan lain -lain, dan pelayan bertindak balas. Pelayan tidak boleh menghantar mesej secara aktif ke penyemak imbas, jadi bagaimana ia menunjukkan bahawa data telah diubah? Nasib baik, anda boleh menggunakan Server Send Events (SSE) untuk menambah ciri -ciri seperti siaran berita langsung, ramalan cuaca, dan harga saham.Ia selalu mungkin menggunakan teknologi web standard untuk mencapai kemas kini data masa nyata:
Server Send Events (SSE) membolehkan pelayan menolak data ke penyemak imbas pada bila -bila masa:
Pada dasarnya, SSE adalah aliran data tanpa had. Fikirkannya sebagai memuat turun fail yang tidak terhingga yang dimuat turun dalam kepingan kecil yang boleh anda memintas dan membaca.
SSE pada asalnya dilaksanakan pada tahun 2006 dan menyokong standard ini dalam semua pelayar utama. Ia mungkin tidak dikenali sebagai WebSockets, tetapi pelayan menghantar acara lebih mudah, menggunakan HTTP standard, menyokong komunikasi sehala, dan menyediakan penyambungan semula automatik. Tutorial ini menyediakan contoh kod Node.js tanpa modul pihak ketiga, tetapi SSE boleh digunakan dalam bahasa pelayan lain, termasuk PHP.
Permulaan cepat pelayan hantar acara
Demonstrasi berikut melaksanakan pelayan web Node.js yang mengeluarkan nombor rawak antara 1 dan 1000 pada selang rawak sekurang -kurangnya setiap tiga saat.
anda boleh mencari demo node.js SSE kami di sini.
Kod ini menggunakan modul HTTP dan URL standard Node.js untuk membuat pelayan web dan menghuraikan URL:
<code class="language-javascript">import http from "node:http"; import url from "node:url";</code>
cek pelayan untuk permintaan URL masuk dan bertindak balas ketika menghadapi jalan /rawak:
<code class="language-javascript">const port = 8000; http.createServer(async (req, res) => { // 获取 URI 路径 const uri = url.parse(req.url).pathname; // 返回响应 switch (uri) { case "/random": sseStart(res); sseRandom(res); break; } }).listen(port); console.log(`server running: http://localhost:${port}\n\n`);</code>
Ia pada mulanya bertindak balas dengan tajuk aliran acara SSE HTTP:
<code class="language-javascript">// SSE 头 function sseStart(res) { res.writeHead(200, { Content-Type: "text/event-stream", Cache-Control: "no-cache", Connection: "keep-alive" }); }</code>
Fungsi lain kemudian menghantar nombor rawak dan memanggil dirinya selepas selang rawak berlalu:
<code class="language-javascript">// SSE 随机数 function sseRandom(res) { res.write("data: " + (Math.floor(Math.random() * 1000) + 1) + "\n\n"); setTimeout(() => sseRandom(res), Math.random() * 3000); }</code>
Jika anda menjalankan kod anda secara tempatan, anda boleh menggunakan curl di terminal anda untuk menguji tindak balas:
<code class="language-bash">$> curl -H Accept:text/event-stream http://localhost:8000/random data: 481 data: 127 data: 975</code>
Tekan ctrl |. JavaScript pelanggan pelayar menghubungkan ke /uri rawak menggunakan pembina objek Eventsource:
Data masuk mencetuskan pengendali acara mesej, di mana data: rentetan selepas ia tersedia di harta .data objek acara:
<code class="language-javascript">// 客户端 JS const source = new EventSource("/random");</code>Petua penting
<code class="language-javascript">source.addEventListener('message', e => { console.log('RECEIVED', e.data); });</code>seperti mengambil (), penyemak imbas mengeluarkan permintaan HTTP standard, jadi anda mungkin perlu mengendalikan CSP, CORS, dan mempunyai pilihan untuk lulus parameter kedua
{ withCredentials: true }
Data mesej hanya boleh menjadi rentetan dalam data format: SSE tidak memerlukan lebih banyak kod daripada yang ditunjukkan di atas, tetapi bahagian berikut membincangkan pilihan lain.
Pelayan boleh menyediakan bilangan URL saluran SSE. Contohnya:
Pilihan lain adalah untuk menyediakan URL akhir titik, seperti /terkini, yang menghantar sebarang jenis data pada satu saluran komunikasi. Penyemak imbas boleh menunjukkan topik kepentingan dalam rentetan pertanyaan URL, seperti /terkini jenis = berita, cuaca, saham saham, supaya pelayan dapat mengehadkan respons SSE kepada mesej tertentu.
hantar data yang berbeza pada saluran tunggal
yang berkaitan yang diluluskan di atas garis event:
untuk mengenal pasti jenis maklumat tertentu: data:
<code class="language-javascript">import http from "node:http"; import url from "node:url";</code>Ini tidak mencetuskan pengendali acara "mesej" pelanggan. Anda mesti menambah pengendali untuk setiap jenis acara. Contohnya:
menggunakan pengenal data
<code class="language-javascript">const port = 8000; http.createServer(async (req, res) => { // 获取 URI 路径 const uri = url.parse(req.url).pathname; // 返回响应 switch (uri) { case "/random": sseStart(res); sseRandom(res); break; } }).listen(port); console.log(`server running: http://localhost:${port}\n\n`);</code>
: data:
id:
<code class="language-javascript">// SSE 头 function sseStart(res) { res.writeHead(200, { Content-Type: "text/event-stream", Cache-Control: "no-cache", Connection: "keep-alive" }); }</code>
ID terkini juga boleh didapati di harta tanah.
Nyatakan Retry Delay
<code class="language-javascript">// SSE 随机数 function sseRandom(res) { res.write("data: " + (Math.floor(Math.random() * 1000) + 1) + "\n\n"); setTimeout(() => sseRandom(res), Math.random() * 3000); }</code>Walaupun penyambungan semula adalah automatik, pelayan anda mungkin tahu bahawa data baru tidak diperlukan untuk tempoh masa tertentu, jadi tidak perlu mengekalkan saluran komunikasi aktif. Pelayan boleh menghantar respons
Selepas menerimanya, penyemak imbas akan meninggalkan sambungan SSE dan cuba menyambung semula selepas masa kelewatan telah berlalu. retry:
<code class="language-bash">$> curl -H Accept:text/event-stream http://localhost:8000/random data: 481 data: 127 data: 975</code>
Di samping "mesej" dan acara yang dinamakan, anda juga boleh membuat "pembuka" dan "ralat" pengendali dalam klien JavaScript.
Apabila sambungan pelayan gagal atau ditamatkan, peristiwa "ralat" dicetuskan. Anda boleh menyemak.
ingat, tidak perlu menyambung semula:
<code class="language-javascript">// 客户端 JS const source = new EventSource("/random");</code>ia akan berlaku secara automatik.
menamatkan komunikasi SSE
<code class="language-javascript">source.addEventListener('message', e => { console.log('RECEIVED', e.data); });</code>
Penyemak imbas boleh menamatkan komunikasi SSE menggunakan kaedah .close () objek Eventsource. Contohnya:
retry:
kelewatan, kemudian Hanya pelayar boleh mewujudkan semula sambungan dengan membuat objek Eventsource baru.
Kesimpulan
Acara sisi pelayan menyediakan cara untuk melaksanakan kemas kini halaman masa nyata, yang mungkin lebih mudah, lebih praktikal dan lebih ringan daripada mengambil Ajax pengundian berasaskan (). Kerumitan terletak di sisi pelayan. Anda mesti:
tetapi ini benar -benar di bawah kawalan anda, dan lanjutannya tidak sepatutnya lebih kompleks daripada aplikasi web lain.
Satu -satunya kelemahan adalah bahawa SSE tidak membenarkan anda menghantar mesej dari penyemak imbas ke pelayan (kecuali permintaan sambungan awal). Anda boleh menggunakan Ajax, tetapi ini terlalu lambat untuk aplikasi seperti permainan tindakan. Untuk komunikasi dua arah yang betul, anda memerlukan websocket. Sila lihat cara membuat aplikasi langsung menggunakan WebSockets di Node.js untuk mengetahui lebih lanjut!
Atas ialah kandungan terperinci Cara Menggunakan Acara Server-Sent di Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!