Ignorare l'emissione di socket.io e accenderla?
Domanda
Durante lo sviluppo, è di grande aiuto essere in grado di vedere quali pacchetti arrivano e vengono inviati.Questo è possibile sul lato server con logger.Sul lato client, tuttavia, non è presente alcun logger.Mi ritrovo a sporcare console.log dappertutto.
È possibile sovrascrivere socket.emit e socket.on con console.log (argomenti)?Se posso sovrascriverlo prima della mia presa, sarebbe davvero elegante.
Qualcuno mi ha consigliato di ignorare invece il parser.
Quali sono i tuoi 2 centesimi su questo?
<”EDIT
Ho provato il suggerimento di Kato e ho scritto quanto segue:
var _origEmit = socket.emit;
socket.emit = function() {
console.log("SENT", Array.prototype.slice.call(arguments));
_origEmit.call(socket, arguments);
};
Funziona.Tuttavia, non tanto con socket.on.La mia strategia è racchiudere ogni callback con un console.log.Se conosci Python, è un po 'come mettere 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é la patch di monkey socket.on non funziona?
Soluzione
Per sovrascrivere socket.on devi effettivamente sostituire socket. $ emit .
L'esempio seguente funziona sia lato client che lato server (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);
};
})();
Altri suggerimenti
Funziona, testato:
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);
};
Esiste un modulo chiamato socket.io-wildcard che consente di utilizzare caratteri jolly su client e serverlato, non c'è più bisogno di sovrascrivere 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);
<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>