2012-01-12 10 views
20

Durante lo sviluppo, mi aiuta molto a essere in grado di vedere quali pacchetti arrivano e vengono inviati. Questo è possibile sul lato server con il logger. Sul lato client, tuttavia, non esiste un logger. Mi trovo a fare i rifiuti di console.log dappertutto.Sovrascrivere socket.io emette e accende?

È possibile eseguire l'override di socket.emit e socket.on con console.log (argomenti)? Se riesco a scavalcare questo prima della mia presa, sarebbe davvero elegante.

Qualcuno mi ha consigliato di ignorare invece il parser.

Quali sono i tuoi 2cents su questo?

EDIT

Ho provato il suggerimento di Kato e ha scritto quanto segue:

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

Questo funziona. Tuttavia, non tanto con socket.on. La mia strategia è quella di avvolgere ogni callback con un console.log. Se conosci Python, è come mettere i decoratori di funzioni sui callback che console.log gli argomenti.

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

Qualcuno può indicare perché socket patch.on scimmia non funziona?

risposta

55

Per ignorare socket.on è effettivamente necessario eseguire l'override presa. $ Emettere.

Seguendo esempio funziona sia client che server-side (testato su 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); 
    }; 
})(); 
+3

Grazie mille. Ha funzionato abbastanza bene. – disappearedng

+4

Mi dispiace di avere solo 1 upvote per questo. –

+0

Brillante, grazie – carpii

0
<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> 
+1

Sì, è necessario utilizzare la sezione. Devi anche usare '_origEmit.apply' invece di' call'. – clarkf

+0

Subito acceso; Applico/chiamo dislessico apparentemente; Sto pensando di mettere quei due e php's strpos/in_array su un Post-It accanto al mio monitor :) – Kato

+0

Aggiornato con i commenti di @ clarkf – Kato

5

Works, testati:

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

Funziona bene in Socket.IO 1.3.7. – Connor

+1

Funziona ma assicurati di non usare questo: 'var packet = packet.data;' all'interno della funzione, facendo ciò rende il pacchetto "non valido" e la funzione di chiamata non verrà invocata. – Garre

3

C'è un modulo chiamato socket.io-wildcard che permette utilizzando i caratteri jolly sul lato client e server, non è necessario sovrascrivere più nulla

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

io.use(middleware); 

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

io.listen(8000);