GET
リクエストを自分のノードサーバーからTwitterに送信し、応答データを解析してwebsocket
(ws、wssではない)接続経由で送信します。私がしましたソケットがハングアップ:Websocket Twitter APIへのHTTPSリクエストを受け取ります
Error: socket hang up
at createHangUpError (_http_client.js:200:15)
at TLSSocket.socketOnEnd (_http_client.js:292:23)
at emitNone (events.js:72:20)
at TLSSocket.emit (events.js:166:7)
at endReadableNT (_stream_readable.js:905:12)
at nextTickCallbackWith2Args (node.js:442:9)
at process._tickCallback (node.js:356:17)
:30秒(私はそれが常に30 +/- 1秒だが、それを時限)、ソケット接続がハングアップして、私は次のエラー・スタックを取得した後、ことを除いて - すべてが働いていますTwitterの公開ストリームで同じサーバーデザインを使用していて、うまくいきました。ハングアップが発生したことをGET
要求で実装した場合のみです。
はこれまでのところ、私は次の解決策を試してみた:
- は、TwitterのクエリURIエンコードされた文字列で、低カウント値とメーリングリストのダウン要求の着信率を絞ります。タイムアウトは〜30秒
- は私のGETリクエストのオプションに
keepAliveAgent
- が
- は
KeepAliveInterval
、keepaliveGracePeriod
を設定要求のため、手動で構築された(なしnpm
モジュール)薬を試しセットまだ後、でも私に戻って送信され1件のつぶやきで発生します、ソケットサーバ - と無駄にノードnewbishもの
すべての束に とdropConnectionOnKeepaliveTimeout
。アプリは30秒間美しく動作し続けます。その後、ハングアップします。
私の次のリード:Twitterでは、HTTPS経由でアプリケーションのみの認証済みリクエストを送信する必要があります。私は、異なるセキュリティレベルのために自分のコードに規定を設けていません。私は今それをフォローアップして、SOのコミュニティに何か考えがあるかどうかを確認します。あなたが提供できるどんな助けも大変に感謝しています!ここで
は必需品を露出するためにストリップダウンコードは、です:
// Initialize basic server for the web socket requests
var handShakeServer = http.createServer(function(request, response) {
console.log((new Date()) + ' Received request for ' + request.url);
response.writeHead(404);
response.end();
});
handShakeServer.listen(8080, function() {
console.log((new Date()) + ' Socket server is listening on port 8080');
});
// Initialize the socket server itself.
var socketServer = new WebSocketServer({
httpServer: handShakeServer,
autoAcceptConnections: false,
keepAliveInterval: (3600 * 1000),
dropConnectionOnKeepaliveTimeout: false
});
// On request, listen for messages.
socketServer.on('request', function(request) {
// Initialize connection from verified origin
var connection = request.accept('echo-protocol', request.origin);
// On message (search params from client), query Twitter.
connection.on('message', function(message) {
// BEARER_ACCESS_TOKEN is for Twitter's application-only authentication
var options = {
'path': '/1.1/search/tweets.json?q=stuff',
'hostname': 'api.twitter.com',
'method': 'GET',
'headers': {
'Authorization': ('Bearer ' + process.env.BEARER_ACCESS_TOKEN),
'Accept': '*/*'
},
'agent': agent,
'port': 443,
};
// Query twitter via HTTPS GET, listen for response
var req = new https.request(options, function(res) {
var responseString = '';
// On data, concatenate the chunks into a whole JSON object
res.on('data', function(tweet) {
responseString += tweet;
});
// On completion of request, send data to be analyzed.
res.on('end', function() {
// Once returned, send data to client through socket connection.
var result = doSomeAnalysis(JSON.parse(responseString));
connection.sendUTF(JSON.stringify(result));
});
});
// The https request is done; terminate it.
req.end();
});
});
はまた、ウェブソケットクライアント側では、私が持っている:
client.connect('ws://localhost:8080/', 'echo-protocol', 'twitterQuery');
そして、ここでは、私のserver.jsの関連モジュール:
var util = require('util');
var https = require('https');
var http = require('http');
var WebSocketServer = require('websocket').server;
var HttpsAgent = require('agentkeepalive').HttpsAgent;
「npm websocket」を使用していて、同じ問題が発生している場合は、この文書[こちら](https://github.com/theturtle32/WebSocket-Node/blob/master)を参照してください。 /docs/WebSocketServer.md#server-config-options) - ただし、デフォルトの設定は当てにしないでください。上に行ったのと同じことを達成するために、短い間隔で手動で「keepalive:true」を設定します。 –