Я хочу сделать запрос GET
с моего сервера Node на Twitter, проанализировать данные ответа и отправить его через соединение (ws, not wss). Все работает - за исключением того, что через 30 секунд (я засек, это всегда 30 +/- 1 сек), подключение к сокету вешает трубку, и я получаю следующее сообщение об ошибке: стекSocket повесить трубку: Websocket GET HTTPS запрос на Twitter API
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)
Я использовали тот же дизайн сервера с публичным потоком Twitter, и он работал хорошо. Только при выполнении запроса GET
происходит зависание.
До сих пор, я попытался следующие решения:
- дроссельного запрос входящей скорости Waaaay вниз с низким значением счета в Ури закодированных строк запроса Twitter; Тайм-аут происходит даже с 1 твит отправлены обратно ко мне, еще через ~ 30 секунд
- установить
keepAliveAgent
мои параметры запроса GET - попытался вручную встроенный (не
npm
модуль) агента для запроса - набор
KeepAliveInterval
,keepaliveGracePeriod
, иdropConnectionOnKeepaliveTimeout
на сокет сервера - и кучу УЗЕЛ newbish вещей
все без толку. Приложение прекрасно работает в течение 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');
И здесь являются модули, имеющие отношение к моему серверу.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» вручную, с небольшим интервалом, чтобы выполнить ту же самую вещь, что и я выше. –