ソケットを使用せずにリアルタイムのデータストリームを送信します.io
12856 ワード
ハイフォークス
これまでは、サーバーから進行状況を取得する進行状況バーを望んでいたが、実際にそれはあまりにも多くの仕事cozを行ったことがない?
この記事では、多くのクールなことをするために使用できるバックエンドとフロントエンドの両方にSSE(Server send event)を実装する方法を示します😀)
そこで、しばらく戻ってMERNプロジェクトに取り組んでいました.クライアントのバックエンドAPIの進捗状況をリアルタイムで追跡する必要がありました.
ソケットを使っている人を見つけました.リアルタイムデータストリーム用のIOですが、私はこの単純なユースケースのためにライブラリ全体(~ 43.3 KB)を使いたくありませんでした.私は何かネイティブの余分なセットアップを必要とするネイティブ+簡単に使用したい.
私が見つけたときEventSource API これはバックエンドからイベントストリームを追跡するネイティブAPIです.
それは非常に使いやすく、余分なライブラリが必要です.
私はノードを使用しています.ランタイム&サーバーのリクエストを処理するための表現のためのJS&タイプスクリプトは、どんなバックエンドenvを使用して自由に感じる. インデックスを作成します.TSファイルと必須モジュールのインポート
サーバーを起動し、お好みの任意のポートを聞いて.私はこの例で4000を使います.
今すぐ作成
私はまた、それが少し現実的にするために睡眠機能を使用して遅延を追加しました.
改行文字 最後に、要求されたときにこのルートにイベントを送信するためのルートを宣言し、次のヘッダーをデータイベントを書き込む前にレスポンスに追加します.
応答サイクルを終了することを忘れないでください
それはすべてのExpressとノードを使用してクライアントにデータのリアルタイムストリームを送信する必要があります.js
私はこれのために反応を使用しています、しかし、どんなJSフレームワークまたはちょうどバニラJS(あなたが好む何でも)を使用するのを自由に感じてください. 簡単な反応プロジェクトを使用してセットアップ データ状態を作成し、空の配列で初期化します.
実装する
今、単にデータ配列を使用してリストを返し、データを受け取るときにリストが更新されるのを見てください
😀 すごい!あなたは、単にそれらのイベントを聞くためにSSEとクライアントを送るために単純なサーバーを実装しました.
最後まで貼り付けてくれてありがとう.ドロップしてください❤ 閉じるこの動画はお気に入りから削除されています.
これまでは、サーバーから進行状況を取得する進行状況バーを望んでいたが、実際にそれはあまりにも多くの仕事cozを行ったことがない?
この記事では、多くのクールなことをするために使用できるバックエンドとフロントエンドの両方にSSE(Server send event)を実装する方法を示します😀)
📜 ちょっと文脈
そこで、しばらく戻ってMERNプロジェクトに取り組んでいました.クライアントのバックエンドAPIの進捗状況をリアルタイムで追跡する必要がありました.
ソケットを使っている人を見つけました.リアルタイムデータストリーム用のIOですが、私はこの単純なユースケースのためにライブラリ全体(~ 43.3 KB)を使いたくありませんでした.私は何かネイティブの余分なセットアップを必要とするネイティブ+簡単に使用したい.
私が見つけたときEventSource API これはバックエンドからイベントストリームを追跡するネイティブAPIです.
それは非常に使いやすく、余分なライブラリが必要です.
💻 どのようにそれを実装するには?
サーバからイベントを送信する📡
私はノードを使用しています.ランタイム&サーバーのリクエストを処理するための表現のためのJS&タイプスクリプトは、どんなバックエンドenvを使用して自由に感じる.
import express, { Response } from 'express';
import axios from 'axios';
app.listen('4000', () => {
console.log('Server listening to port 4000');
});
sendData
クライアントにデータを送信する関数.私は偽のAPIジェネレータを使用しています"JSONPlaceholder" ランダムなデータを取得する場合.私はまた、それが少し現実的にするために睡眠機能を使用して遅延を追加しました.
const sendData = async (id: number, res: Response) => {
const { data } = await axios.get(
'https://jsonplaceholder.typicode.com/todos/' + id
);
const dataString = JSON.stringify(data);
await sleep(1000);
res.write('event: message\n');
res.write('data: ' + dataString);
res.write('\n\n');
};
const sleep = async (ms: number) => {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
};
今、ここで注意すべき重要なことはほとんどありません.🚨res.write('event: message\n')
- これは、クライアントが聞くイベントの種類を指定するために使用されます.メッセージはあなたが好きなものに置き換えることができます.res.write('data: ' + dataString)
- これは' message 'イベントの下で送信するデータを指定する場所です.\n
クライアントがデータとイベントを適切に解析するのに非常に重要です応答サイクルを終了することを忘れないでください
res.end()
app.get('/events', async (_, res) => {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
});
for (let i = 1; i < 10; i++) {
await sendData(i, res);
}
res.end();
});
そしてそれです.それはすべてのExpressとノードを使用してクライアントにデータのリアルタイムストリームを送信する必要があります.js
クライアント側のイベントを受信する📥
私はこれのために反応を使用しています、しかし、どんなJSフレームワークまたはちょうどバニラJS(あなたが好む何でも)を使用するのを自由に感じてください.
create-react-app
とアプリケーションからすべてのコードを削除します.アプリの機能の中にTSX.const [data,setData] = useState<any>([]);
useEffect
イベントハンドリングロジックを書くフックuseEffect(() => {
// An instance of EventSource by passing the events URL
const eventSource = new EventSource('http://localhost:4000/events');
// A function to parse and update the data state
const updateData = (messageEvent: MessageEvent) => {
const parsedData = JSON.parse(messageEvent.data);
setData((data: any) => [...data, parsedData]);
if (parsedData.id === 9) {
eventSource.close();
}
};
// eventSource now listening to all the events named 'message'
eventSource.addEventListener('message', updateData);
// Unsubscribing to the event stream when the component is unmounted
return () => eventSource.close();
}, []);
return (
<div>
<ul>
{data.map((_: any) => (
<li>{_.title}</li>
))}
</ul>
</div>
);
あなたがすべてを正しくしたならば、あなたが開いたとき、あなたはこのように何か出力をブラウザで見ることができますhttp://localhost:3000
😀 すごい!あなたは、単にそれらのイベントを聞くためにSSEとクライアントを送るために単純なサーバーを実装しました.
最後まで貼り付けてくれてありがとう.ドロップしてください❤ 閉じるこの動画はお気に入りから削除されています.
Reference
この問題について(ソケットを使用せずにリアルタイムのデータストリームを送信します.io), 我々は、より多くの情報をここで見つけました https://dev.to/hritique/send-realtime-data-streams-without-using-socket-io-32l6テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol