Frage

Während der Entwicklung hilft es mir sehr, zu sehen, welche Pakete ankommen und gesendet werden.Dies ist serverseitig mit Logger möglich.Auf der Client-Seite gibt es jedoch keinen Logger.Ich finde mich überall auf der Konsole wieder.

Ist es möglich, socket.emit und socket.on mit console.log (Argumente) zu überschreiben?Wenn ich dies vor meiner Steckdose überschreiben kann, wäre es wirklich elegant.

Jemand hat mir geraten, stattdessen den Parser zu überschreiben.

Was sind deine 2 Cent dazu?

EDIT

Ich habe Katos Vorschlag ausprobiert und Folgendes geschrieben:

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

Das funktioniert.Allerdings nicht so sehr mit socket.on.Meine Strategie ist es, jeden Rückruf mit einem console.log zu versehen.Wenn Sie Python kennen, ist es so, als würden Sie Funktionsdekoratoren auf die Rückrufe setzen, mit denen console.log die Argumente protokolliert.

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

Kann jemand darauf hinweisen, warum Monkey Patching Socket.on nicht funktioniert?

War es hilfreich?

Lösung

Um socket.on zu überschreiben, müssen Sie tatsächlich socket. $ emit . überschreiben

Das folgende Beispiel funktioniert sowohl clientseitig als auch serverseitig (getestet auf 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);
  };
})();

Andere Tipps

Funktioniert, getestet:

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

Es gibt ein Modul namens socket.io-wildcard , mit dem Platzhalter auf Client und Server verwendet werden könnenSeite, keine Notwendigkeit mehr, etwas zu überschreiben

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top