Redéfinition et la Émettre de socket.io?
Question
Au cours du développement, il me aide grandement à être en mesure de voir ce que les paquets arrivent et est envoyé. Ceci est possible du côté serveur avec enregistreur. Au niveau du client, cependant, il n'y a pas enregistreur. Je me trouve à être jeter des ordures console.log partout.
Est-il possible de passer outre socket.emit et socket.on avec console.log (arguments)? Si je peux passer outre cela à la prise avant mon, il serait vraiment élégant.
Quelqu'un m'a conseillé de remplacer le Parser à la place.
Quelle est votre 2cents à ce sujet?
EDIT
J'ai essayé la suggestion de Kato et écrit ce qui suit:
var _origEmit = socket.emit;
socket.emit = function() {
console.log("SENT", Array.prototype.slice.call(arguments));
_origEmit.call(socket, arguments);
};
Cela fonctionne. Cependant, tant avec socket.on. Ma stratégie consiste à envelopper chaque rappel avec un console.log. Si vous connaissez python, il est un peu comme mettre des décorateurs de fonction sur les callbacks qui CONSOLE.LOG les arguments.
(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]);
}
Tout le monde peut indiquer pourquoi socket.on patching de singe ne fonctionne pas?
La solution
Pour remplacer socket.on vous avez réellement besoin de remplacement socket. Émettre $ .
L'exemple suivant fonctionne à la fois client et côté serveur (testé sur 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);
};
})();
Autres conseils
Travaux, testé:
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);
};
Il y a un module appelé socket.io-joker qui permet d'utiliser des caractères génériques sur le client et le serveur côté, pas besoin de quoi que ce soit Ecraser plus
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>