重写socket.io的发射和?

在开发过程中,能够很好地看到数据包到达并发送。 这在logging器的服务器端是可能的。 但在客户端,没有logging器。 我发现自己乱扔console.log到处都是。

是否有可能用console.log(参数)覆盖socket.emit和socket.on? 如果我可以重写这个在我的套接字之前,这将是非常优雅的。

有人build议我改写parsing器。

你的2分是什么?

编辑

我试图加藤的build议,并写下如下:

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

这工作。 但是,与socket.on没有太大关系。 我的策略是用console.log包装每个callback。 如果你知道python,就好像把函数装饰器放在callback函数console.log中。

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

任何人都可以指出为什么猴子修补socket.on不工作?

要覆盖socket.on,你实际上需要重写socket。$ emit

以下示例同时适用于客户端和服务器端(在socket.io 0.9.0上testing):

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

作品,testing:

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

有一个叫做socket.io-wildcard的模块,它允许在客户端和服务器端使用通配符,不需要覆盖任何东西

 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>