1

text/event-streamExpress.js エンドポイントから SSE 応答を送信しようとしています。私のルートハンドラは次のようになります:

function openSSE(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream; charset=UTF-8',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Transfer-Encoding': 'chunked'
  });

  // support the polyfill
  if (req.headers['x-requested-with'] == 'XMLHttpRequest') {
    res.xhr = null;
  }

  res.write(':' + Array(2049).join('\t') + '\n'); //2kb padding for IE
  res.write('id: '+ lastID +'\n');
  res.write('retry: 2000\n');
  res.write('data: cool connection\n\n');

  console.log("connection added");
  connections.push(res);
}

後で私は電話します:

function sendSSE(res, message){
    res.write(message);
    if (res.hasOwnProperty('xhr')) {
        clearTimeout(res.xhr);
        res.xhr = setTimeout(function () {
          res.end();
          removeConnection(res);
        }, 250);
    }
}

私のブラウザはリクエストを作成して保持します: ここに画像の説明を入力

ブラウザーにプッシュされる応答はありません。私のイベントはどれも発生しません。Express.js サーバーを強制終了した場合。応答が突然排出され、すべてのイベントがブラウザーに一度にヒットします。 ここに画像の説明を入力

コードを更新res.end()して行の後に追加するres.write(message)と、ストリームは正しくフラッシュされますが、イベント ポーリングにフォールバックし、応答をストリーミングしません。 ここに画像の説明を入力

res.write(':' + Array(2049).join('\t') + '\n'); 他の SO 投稿から見たように、ブラウザーをトリガーして応答を排出できるように、応答の先頭にパディングを追加しようとしました 。

http以前にこのコードをノードのネイティブサーバーで使用していて、正しく機能していたため、これは Express.js の問題であると思われます。したがって、エクスプレスの応答オブジェクトのラッピングをバイパスする方法があるかどうか疑問に思っています。

4

2 に答える 2