node.jsで長いポーリングを行っています
基本的に、node.jsサーバーはユーザーからの要求を受け入れ、いくつかの更新を確認します。更新がない場合は、タイムアウト後に更新をチェックします。
しかし、ユーザーがタブを閉じたか、別のページに行った場合はどうなりますか?私の場合、スクリプトは動作し続けます。
ユーザがリクエストを中止したとき(接続を閉じたとき)に、node.jsがチェックまたは検出したり、イベントをキャッチする方法はありますか?node.jsサーバーで接続が切断されたかどうかを確認する方法
答えて
おかげで私は、「閉じる」イベントをキャッチすることができましたが、私はいくつかの追加の調整をしなければなりませんでした。
「閉鎖」イベントを捕捉するだけで問題が解決されなかった理由は、クライアントがnode.jsサーバーに要求を送信すると、サーバーが接続がまだ開いていればサーバー自体が情報を取得できないことですクライアントに何かを送り返します(私が理解する限り - これはHTTPプロトコルのためです)。
追加の調整は、応答に何かを書き込むことでした。
これを防止するもう一つのことは、 'application/json'として 'Content-type'があることです。これを 'text/javascript'に変更することで、接続を閉じることなく「ホワイトスペース」を時折ストリームすることができました。最後に
は、私はこのようなものだった:
var server = http.createServer(function(req,res){
res.writeHead(200, {'Content-type': 'text/javascript'});
req.connection.on('close',function(){
// code to handle connection abort
});
/**
* Here goes some long polling handler
* that performs res.write(' '); from time to time
*/
// some another code...
});
server.listen(NODE_PORT, NODE_LISTEN_HOST);
を私の元のコードははるかに大きいので、私はちょうど敏感な部分を表示するためにそれをたくさんカットしなければなりませんでした。
もっと良い解決策があるかどうかを知りたいが、これは現時点で私のために働いている。
は、あなたの質問はこの1つに非常によく似ているようです:
NodeJS HTTP request connection's close event fired twice
は
request.connection.on('close', function() {
...
});
を試す確認するか、検出またはキャッチするためのNode.jsの中に方法はあります ユーザーがリクエストを中断した場合(接続を終了しましたか?)
http.ServerRequest close eventを試すことができます。簡単な例:Miroshkoのとyojimbo87の答えに
var http = require("http"),
util = require("util");
var httpServer = http.createServer(function(req, res) {
util.log("new request...");
// notify me when client connection is lost
req.on("close", function(err) {
util.log("request closed...");
});
// wait with response for 15 seconds
setTimeout(function() {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write("response");
res.end();
util.log("response sent...");
}, 15000);
});
httpServer.listen(8080);
util.log("Running on 8080");
あなたはreq.on('close', function(err) { ... });
代わりのreq.connection.on('close', function(err) { ... });
非常に重要な違いがありますを使用する必要があります。 req.connection()がreq.connection.on()の間にreq.on()がこの要求にリスナーを追加すると、クライアントとサーバー間の(キープアライブ)接続にリスナーが追加されます。 req.connection.on()を使用する場合、クライアントが接続を再利用するたびに、同じ接続にもう1つのリスナーを追加します。最後に接続が切断されると、すべてのリスナーが起動されます。
機能スコープは、通常、サーバロジックを壊すことから安全ですが、それでも危険です。幸いにも少なくともNodeJS 0.10。図26は、このユーザーに警告するのに十分なスマートです:
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace:
at Socket.EventEmitter.addListener (events.js:160:15)
at Socket.Readable.on (_stream_readable.js:689:33)
...
私はExpress.js(〜4.10.6)を使用していて、次のコードは、私のために正常に動作している:
//GET Request:
app.get('/', function(req, res){
req.on('close', function(){
console.log('Client closed the connection');
});
});
次第ブラウザのタブを閉じると、ブラウザは接続を閉じ、コールバック関数は期待通りに実行されます。
- 1. Node.jsでMongoDB接続が有効かどうかを確認する方法
- 2. ジャージー:接続が切断されたときの認識方法
- 3. FreeTDSとPyODBCランダム接続がサーバーから切断される
- 4. MQが接続されているかどうかを確認する方法
- 5. WifiがAndroidで接続されているかどうかを確認する適切な方法
- 6. アンドロイドでWiFi adbが接続または切断されているかどうかをプログラムで確認するにはどうすればよいですか?
- 7. C#ソケット - クライアントが切断するかどうかを確認する方法
- 8. C#MongoDB.Driver:サーバーが接続されているかどうかを確認する方法。 GetServerの置き換え
- 9. DCOM:クライアントクラッシュ時にサーバーで接続を切断する方法は?
- 10. Javaでサーバが接続を切断した(RSTパケットを受信した)かどうかを確認するにはどうすればよいですか?
- 11. httpClient:サーバー側で接続が既に閉じられているかどうかを確認する方法
- 12. ソケットへの接続が切断されたかどうかを調べる方法
- 13. クライアントのインターネット接続が切断されているかどうかを確認するにはどうすればよいですか?
- 14. 接続されたデータグラムソケットを切断して再接続する
- 15. デバイスが電源、USBまたはDockに接続されているかどうかを確認する方法
- 16. 切断されたネットワークドライブの再接続
- 17. サーバーが切断されたときに強制的にTCP接続を切断する
- 18. デバイスがウェブに接続されているかどうかを確認する
- 19. Bluetoothが接続されているかどうかを確認する
- 20. ユーザーにマイクが接続されているかどうかを確認する
- 21. TCP接続がアクティブかどうかを確認する最良の方法
- 22. インターネット接続が可能かどうかを確認する方法は?
- 23. オブジェクトはどのようにクライアントとの接続が切断されますか?
- 24. キーボードが接続/切断されたときのWin32の判断
- 25. Excel 2016のVBAでのADODB接続タイムアウト - 接続がまだアクティブかどうかを確認する方法?
- 26. クライアントがサーバー/クライアント側で切断されているかどうかを確認する方法はありますか?
- 27. シリアルポートがLinuxで接続/切断されているかどうかを知ることはできますか?
- 28. ファイルをダウンロードした後にFTPサーバー接続を切断する方法は?
- 29. Node.JSサーバーは頻繁に切断されますか?
このページには、一般的にクローズドTCP接続の検出に関する詳細情報があります。http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html –