Переориентировать socket.io испускать и продолжать?

Во время разработки мне очень помогает видеть, какие пакеты поступают и отправляются. Это возможно на стороне сервера с помощью регистратора. Однако на стороне клиента нет регистратора. Я нахожусь в том, что мусор console.log повсюду.

Можно ли переопределить socket.emit и socket.on с помощью console.log(аргументы)? Если я могу переопределить это в моем сокете, это будет очень изящно.

Кто-то посоветовал мне вместо этого переопределить Парсер.

Какие ваши 2центы на этом?

ИЗМЕНИТЬ

Я попробовал предложение Като и написал следующее:

var _origEmit = socket.emit;
socket.emit = function() { 
  console.log("SENT", Array.prototype.slice.call(arguments));
  _origEmit.call(socket, arguments);
};

Это работает. Однако, не так много с socket.on. Моя стратегия состоит в том, чтобы обернуть каждый обратный вызов с помощью console.log. Если вы знаете python, это похоже на то, чтобы положить декораторы функций на обратные вызовы, которые console.log аргументы.

(function(socket) { 
var _origOn = socket.on;
socket.on = function() { 
  var args = Array.prototype.slice.call(arguments)
    , handlerType = args[0]
    , originalCallback = args[1];

  var wrappedCallback = function() { 
    // replace original callback with a function 
    // wrapped around by console.log
    console.log("RECEIVED", Array.prototype.slice.call(arguments));
    originalCallback.call(socket, arguments);
  }

  _origOn.call(socket, [handlerType, wrappedCallback]);
}

Кто-нибудь может указать, почему обезьяна patching socket.on не работает?

Ответ 1

Чтобы переопределить socket.on, вам действительно нужно переопределить сокет . $emit.

Следующий пример работает как на стороне клиента, так и на стороне сервера (проверен на socket.io 0.9.0):

(function() {
  var emit = socket.emit;
  socket.emit = function() {
    console.log('***','emit', Array.prototype.slice.call(arguments));
    emit.apply(socket, arguments);
  };
  var $emit = socket.$emit;
  socket.$emit = function() {
    console.log('***','on',Array.prototype.slice.call(arguments));
    $emit.apply(socket, arguments);
  };
})();

Ответ 2

Работает, тестируется:

var _emit = socket.emit;
    _onevent = socket.onevent;

    socket.emit = function () { //Override outgoing
        //Do your logic here
        console.log('***', 'emit', arguments);
        _emit.apply(socket, arguments);
    };

    socket.onevent = function (packet) { //Override incoming
        var args = packet.data || [];
        //Do your logic here
        console.log('***', 'onevent', packet);
        _onevent.call(socket, packet);
    };

Ответ 3

Существует модуль под названием socket.io-wildcard, который позволяет использовать подстановочные знаки на стороне клиента и сервера, не нужно больше ничего перезаписывать

var io         = require('socket.io')();
var middleware = require('socketio-wildcard')();

io.use(middleware);

io.on('connection', function(socket) {
  socket.on('*', function(){ /* … */ });
});

io.listen(8000);

Ответ 4

<script src="/socket.io/socket.io.js"></script>
<script>
  (function() {

      var _origEmit = socket.emit;
      socket.emit = function() {
         console.log(arguments);
         _origEmit.apply(null, Array.prototype.slice.call(arguments));
      };


  })();
</script>