web-dev-qa-db-ja.com

ネイティブJavaScriptとnode.jsでロングポーリングを使用する方法

チャットアプリケーションにlong pollingを実装する必要があります。私は周りを検索しましたが、JavaScriptを使用してJQueryに実装する方法しかわかりません。 native JavaScriptnode.jsのみを使用して実装するにはどうすればよいですか?いくつかの関連記事や資料を紹介していただけますか?

11
user8244016

Q:JavascriptのネイティブnodeJSでロングポーリングを行う方法

A:まず、ロングポーリングモデルのしくみを理解する必要があります。手がかりがない場合は、 RFC-6202仕様 が出発点として適しています。

読むのが面倒な場合に備えて。クライアントがrequestserverに送信し、応答が返されるまで待機します。

仕様から、クライアントは最初に、タイムアウト値が無限または少なくとも大きいhttp要求を発行する必要があることがわかります。次に、nodeJsアプリケーションであるサーバーは、すべての着信要求をデータ構造(基本的には保持領域)に隠しておきます。アプリケーションは基本的に、イベントがトリガーされるまですべてのresponseオブジェクトを保持し、その後、応答に適切に応答します。

この疑似コードを検討してください:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

var requestCounter = 0;

var responses = {
  /* Keyed by room Id =*/
  "room_abc" : [ /* array of responses */]
};

app.get('/', function (req, res) {
    requestCounter += 1;

    var room = /* assuming request is for room_abc */ "room_abc";

    // Stash the response and reply later when an event comes through
    responses[room].Push(res);

    // Every 3rd request, assume there is an event for the chat room, room_abc.
    // Reply to all of the response object for room abc.
    if (requestCounter % 3 === 0) {
        responses["room_abc"].forEach((res) => {
            res.send("room member 123 says: hi there!");
            res.end();
        });
    }
});

app.use(bodyParser.text({ type: 'text/*' }));
app.use(bodyParser.json());

app.listen(9999, function () {
    console.log('Example app listening on port 9999!')
})

ここで実際の例を書くのは比較的時間がかかりますが、上記のコードは、NodeJSにロングポーリングを実装する方法の良い例です。

postmanをインストールしている場合、またはcurlを使用している場合は、HTTPを呼び出すことができますhttp://localhost:9999/メソッドGETを使用します。最初の2つの呼び出しでは応答が得られないことに注意してください。3番目の呼び出しを起動すると、以前および現在のすべての呼び出しに対する応答が返されます。

ここでのアイデアは、最初にリクエストのresponseオブジェクトを隠しておき、イベントが発生したときに、3番目のHTTP呼び出しごとにすべての応答をループして応答するというものです。チャットアプリケーションの場合、応答をトリガーするイベントは、おそらく誰かがチャットルームにメッセージを送り出したときでしょう。

13
Samuel Toh