@alexdora
Топ-менеджер

Как исправить эту ошибку в NODEJS websockets?

Подключен модуль https://github.com/TooTallNate/node-socks-proxy-agent . Несмотря на то что написано Build Status Failing, модуль работает исправно на wss
Вот ошибка, которая стопорит скрипт. Мне нужно, чтоб скрипт продолжал работать:
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: Connection Timed Out
    at Socket.onTimeout (/home/admin/web/*/public_html/node_modules/socks-proxy-agent/node_modules/socks/lib/socks-client.js:55:20)
    at Socket.g (events.js:180:16)
    at Socket.EventEmitter.emit (events.js:92:17)
    at Socket._onTimeout (net.js:327:8)
    at Timer.unrefTimeout [as ontimeout] (timers.js:412:13)


Вот те самые строки из socks-client.js:55 (finish(new Error 55 строка))

exports.createConnection = function (options, callback) {
        var socket = new net.Socket(), finished = false, buff = new SmartBuffer();

        // Defaults
        options.timeout = options.timeout || 10000;
        options.proxy.command = commandFromString(options.proxy.command);
        options.proxy.userid = options.proxy.userid || "";

        var auth = options.proxy.authentication || {};
        auth.username = auth.username || "";
        auth.password = auth.password || "";

        options.proxy.authentication = auth;

        // Connect & negotiation timeout
        function onTimeout() {
            finish(new Error("Connection Timed Out"), socket, null, callback);
        }
        socket.setTimeout(options.timeout, onTimeout);

        // Socket events
        socket.once('close', function () {
            finish(new Error("Socket Closed"), socket, null, callback);
        });

        socket.once('error', function (err) {
        });


Тут надо читать медленно:
Т.к соединений в WS очень много (700 подключений через разные socks proxy сервера), безусловно где-то будет ошибка таймаута. Сначала такая же ошибка выпадала при ws.on close. Я пересоздавал (делал реконект). Убрал я её пересозданием самого объекта agent от socks-proxy-agent и она пропала. Выпала снова в тот момент, когда начал поднимать более 700 соединений. Методом тыка пришел к выводу, что один из socks proxy просто в таймаут не ответил. Но в итоге стопорится весь скрипт.

ADD:

При изменении timeout до 100000 (100 секунд я так понимаю)

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: socket hang up
    at SecurePair.error (tls.js:1013:23)
    at EncryptedStream.CryptoStream._done (tls.js:705:22)
    at CleartextStream.read [as _read] (tls.js:496:24)
    at CleartextStream.Readable.read (_stream_readable.js:320:10)
    at EncryptedStream.onCryptoStreamFinish (tls.js:301:47)
    at EncryptedStream.g (events.js:180:16)
    at EncryptedStream.EventEmitter.emit (events.js:92:17)
    at finishMaybe (_stream_writable.js:356:12)
    at endWritable (_stream_writable.js:363:3)
    at EncryptedStream.Writable.end (_stream_writable.js:341:5)


ADD2:

Нашел файл по адресу: /node_modules/casperjs/modules/events.js (причем тут casperjs я так и не понял, хотя папка node_modules). И там как раз 72 строка:

EventEmitter.prototype.emit = function emit() {
  var type = arguments[0];
  // If there is no 'error' event listener then throw.
  if (type === 'error') {
    if (!this._events || !this._events.error ||
        (isArray(this._events.error) && !this._events.error.length))
    {
      if (arguments[1] instanceof Error) {
        throw arguments[1]; // Unhandled 'error' event
      } else {
        throw new CasperError("Uncaught, unspecified 'error' event.");
      }
    }
  }

  if (!this._events) return false;
  var handler = this._events[type];
  if (!handler) return false;

  if (typeof handler === 'function') {
    try {
      switch (arguments.length) {
        // fast cases
        case 1:
          handler.call(this);
          break;
        case 2:
          handler.call(this, arguments[1]);
          break;
        case 3:
          handler.call(this, arguments[1], arguments[2]);
          break;
        // slower
        default:
          var l = arguments.length;
          var args = new Array(l - 1);
          for (var i = 1; i < l; i++) args[i - 1] = arguments[i];
          handler.apply(this, args);
      }
    } catch (err) {
      this.emit('event.error', err);
    }
    return true;


ADD

Error("Connection Timed Out"), socket, null, callback); вот эту строку заменил на просто console.log. Выпадает 8-9 строк таких, а потом выпадает Error: socket hang up. Где эту ошибку заблокировать я не нашел. У меня нет файла в системе tls.js. Пипец. Бесит.
  • Вопрос задан
  • 960 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Unhandled 'error' event
не отловленное событие error

замините
socket.once('error', function (err) {
});
на
socket.on('error', function (err) {
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
Rocket Брянск
от 60 000 до 100 000 ₽
22 мая 2024, в 02:15
10000 руб./за проект
21 мая 2024, в 23:47
30000 руб./за проект