Pregunta

Durante el desarrollo, me ayuda mucho poder ver qué paquetes llegan y se envían.Esto es posible en el lado del servidor con logger.En el lado del cliente, sin embargo, no hay registrador.Me encuentro ensuciando console.log por todos lados.

¿Es posible anular socket.emit y socket.on con console.log (argumentos)?Si puedo anular esto antes de mi enchufe, sería realmente elegante.

Alguien me recomendó que anulara el analizador.

¿Cuáles son tus 2 centavos en esto?

<×EDIT

Probé la sugerencia de Kato y escribí lo siguiente:

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

Esto funciona.Sin embargo, no tanto con socket.on.Mi estrategia es envolver cada devolución de llamada con un console.log.Si conoce Python, es como poner decoradores de funciones en las devoluciones de llamada que console.log los argumentos.

(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]);
}

Cualquiera puede señalar por qué el parche de mono socket.on no funciona?

¿Fue útil?

Solución

Para anular socket.on , en realidad necesita anular socket. $ emit .

El siguiente ejemplo funciona tanto en el lado del cliente como en el del servidor (probado en 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);
  };
})();

Otros consejos

Funciona, probado:

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);
    };

Hay un módulo llamado socket.io-wildcard que permite usar comodines en el cliente y el servidorlado, ya no es necesario sobrescribir nada

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

io.use(middleware);

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

io.listen(8000);
<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top