¿Reemplazando la emisión de socket.io y encendido?
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?
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>