2012-01-12 69 views
20

在開發過程中,它能幫助我很好地瞭解哪些數據包到達併發送。這在記錄器的服務器端是可行的。然而,在客戶端,沒有記錄器。我發現自己正在亂扔console.log。覆蓋socket.io的發射和on?

是否有可能用console.log(參數)覆蓋socket.emit和socket.on?如果我可以在我的套接字之前覆蓋它,那將非常優雅。

有人建議我改寫解析器。

你的2cents是什麼?

編輯

我試圖加藤的建議,並寫道:

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

這工作。但是,與socket.on並無太大區別。我的策略是用console.log包裝每個回調。如果你知道python,就好像在調用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不工作?

回答

55

要覆蓋socket.on你確實需要重寫插座。$發出

下面的示例客戶機和服務器端(上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

非常感謝。這工作得很好。 – disappearedng 2012-03-14 01:28:40

+4

我很遺憾,我只有1個upvote。 – 2012-10-04 22:34:19

+0

輝煌,謝謝你 – carpii 2013-08-27 17:17:26

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

是的,你需要使用切片。您還需要使用'_origEmit.apply'而不是'call'。 – clarkf 2012-01-26 07:06:44

+0

正確;我很明顯地申請/呼叫誦讀困難;我正在考慮將這兩個和php的strpos/in_array放在我的監視器旁邊的Post-It :) – Kato 2012-01-26 15:34:53

+0

@ clarkf的評論更新 – Kato 2012-01-26 15:35:43

5

作品,進行測試:

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

在Socket.IO 1.3.7中很好地工作。 – Connor 2015-11-27 20:33:05

+1

這可以正常工作,但不要在函數內部使用:'var packet = packet.data;',這樣做會導致數據包「無效」,並且調用函數將不會被調用。 – Garre 2016-05-12 14:31:46

3

有一個名爲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);