Node.js https.request с заголовком keep-alive - PullRequest
5 голосов
/ 14 июня 2011

Я хочу вытащить сообщения со стены пользователя Facebook.

Следующий фрагмент кода работает, но он никогда не заканчивается:

var https = require('https');

facebookWall = function(user) {
  var options = {
    host: 'graph.facebook.com',
    port: 443,
    path: '/me/home?access_token=' + user.facebook_token + '&since=' + encodeURIComponent(user.facebook_timestamp),
    method: 'GET',
    headers: {
      'Connection':'keep-alive'
    }
  };

  var req = https.request(options)
  .on('response', function(response) {
    var body = '';
    response.on('data', function(data) {
      body += data;
      try {
        var wallPosts = JSON.parse(body);
        console.log("user " + user.id + " has " + wallPosts.data.length + " new items on their wall");
      }
      catch (e) {
        //console.log("waiting for more data chunks...");
      }
    })
  });
  req.end();

  req.on('error', function(e) {
    console.error(e);
  });
}

Я думаю, что это вызвано заголовком 'Connection':'keep-alive'.Когда я заменю его на 'Connection':'close', сценарий прекратит работу, когда все данные будут получены с Facebook.

Я надеюсь, что смогу использовать заголовок keep-alive, чтобы не создавать новое соединение SSL для каждого запроса.У меня есть тысячи запросов, и с заголовком keep-alive он выполняется всего за несколько секунд, в отличие от нескольких минут без заголовка keep-alive.

Кто-нибудь знает, как этого добиться?Я довольно новичок в Node.JS, поэтому, если я упускаю что-то очевидное, я прошу прощения.

Ответы [ 3 ]

5 голосов
/ 28 ноября 2011

Это потому, что keep-alive еще не реализовано для https / tls / ssl в узле 4.x и я считаю, что для 6.x тоже. Вот почему в узле websocket-server это не работает так же, смотрите https://github.com/nephics/node-websocket-server/commit/3a732bff6aabe694834d87086a7718be7c0ce138

0 голосов
/ 18 июня 2011

Вы должны сделать следующее:

1) Поместите response.on ('end', function () {... сделать вывод ...}); для https.request Не выводить данные в response.on ('data', ...);

2) Использовать Connection: keep-alive, «close» приведет к очень плохой производительности. Я провел много испытаний, и я могу это подтвердить.

Кроме этого:

3) В ваших опциях установите агента и установите agent.maxSockets на большее число, если вам нужен параллелизм. по умолчанию только 5.

4) Вам следует подумать о том, чтобы создать собственную процедуру обработки таймаута https.request. (пожалуйста, перейдите в github / joyent и найдите его. в основном используйте setTimeout для выдачи ошибки тайм-аута).

0 голосов
/ 16 июня 2011

Я заметил, что вы используете https. Зависит от того, какую версию узла вы используете, но сейчас есть известная проблема с конечным событием.

https://github.com/joyent/node/issues/728

...