HTML5 と node.js を試しています。Server Sent Events をテストしたところ、問題なく動作しました (この例を参照)。
次にボタン押下にSSEで応答してみました。[インクリメント] ボタンを押すと、テキスト ボックスから数値を選択し、GET メッセージを使用してサーバーに渡します。サーバーは、増加した数値を含むイベントで応答します。eventListener は、受信した数値でテキスト ボックスを更新します。メッセージをログに記録するために、HTML ページに「メッセージ エリア」も追加しました。
それが計画でした。しかし、ボタンをクリックすると、ブラウザーはウィンドウの下部に「ダウンロード」操作が進行中であることを示しますが、完了せず、結果が画面に更新されず、ページの下部にメッセージが表示されません。
ページの読み込み時にイベントを送信すると、イベントは正常に機能します。しかし、GET メッセージに応答して送信すると、HTML ページに応答が表示されません。
ここに HTML セクションがあります。
<form action="/upload" method="get">
<p>Set the temperature and click on send</p>
<input name="temperature" id="TemperatureBox" type="text" value = "33" />
<button type="submit" onclick="form.action='http://localhost:8888/Increment'">Increment</button>
メッセージのハンドラーと、温度ボックスを更新する「温度イベント」のハンドラーを追加しました。
var source = new EventSource('/events');
source.addEventListener('message', function(e) {
//code to display message
}, false);
source.addEventListener('TemperatureValueUpdate', function(e) {
AddLog('TemperatureValueUpdate Listener >> lastEventID: ' + (e.lastEventId || '--') +
', e.data: ' + e.data
+ 'Current value of text box: ' + document.getElementById('TemperatureBox').value);
document.getElementById('TemperatureBox').value= e.data;
}, false);
node.js スクリプトで、メッセージと TemperatureValueUpdate を送信しています
function constructTemperature(response, id, data) {
console.log("Sending Temperature event");
// response.write('id: ' + (new Date()).toLocaleTimeString()+ '\n');
// response.write("data: " + 'Teperature event sent '+ '\n\n');
response.write('event: ' + 'TemperatureValueUpdate' + '\n');
response.write('id: ' + id + '\n');
response.write("data: " + data + '\n\n');
console.log("Finished Temperature event"); }
また、ページ読み込み時に「/events」URL に 200 応答を返しました。
response.writeHead(200, {'Content-Type': 'text/event-stream','Cache-Control': 'no-cache', 'Connection': 'keep-alive' });
私も次のことを試しました
- イベントを送信する前に 202/204 応答を送信する
- イベントの送信前/送信後に response.end() を送信する
- 各イベントの前に 'Content-Type': 'text/event-stream' を送信する
しかし、それらは望ましい結果を生み出しません。ここで何が間違っていますか?