チャットアプリケーションにlong polling
を実装する必要があります。私は周りを検索しましたが、JavaScript
を使用してJQuery
に実装する方法しかわかりません。 native JavaScript
とnode.js
のみを使用して実装するにはどうすればよいですか?いくつかの関連記事や資料を紹介していただけますか?
Q:Javascript
のネイティブnodeJS
でロングポーリングを行う方法
A:まず、ロングポーリングモデルのしくみを理解する必要があります。手がかりがない場合は、 RFC-6202仕様 が出発点として適しています。
読むのが面倒な場合に備えて。クライアントがrequest
をserver
に送信し、応答が返されるまで待機します。
仕様から、クライアントは最初に、タイムアウト値が無限または少なくとも大きい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呼び出しごとにすべての応答をループして応答するというものです。チャットアプリケーションの場合、応答をトリガーするイベントは、おそらく誰かがチャットルームにメッセージを送り出したときでしょう。