2012-01-12 16 views
20

विकास के दौरान, यह मुझे देखने में सक्षम होने में मदद करता है कि कौन से पैकेट आते हैं और भेजे जाते हैं। लॉगजर के साथ सर्वर पक्ष पर यह संभव है। ग्राहक अंत में, हालांकि, कोई लॉगर नहीं है। मैं खुद को जगह पर कंसोल.लॉग कूल्हे करने के लिए पाता हूं।socket.io के उत्सर्जन को ओवरराइड करना और चालू करना?

क्या console.log (arguments) के साथ socket.emit और socket.on को ओवरराइड करना संभव है? अगर मैं इसे अपने सॉकेट से पहले ओवरराइड कर सकता हूं, तो यह वास्तव में सुरुचिपूर्ण होगा।

किसी ने मुझे सलाह दी कि इसके बजाय पार्सर को ओवरराइड करें।

इस पर आपके 2 सेंट क्या हैं?

संपादित

मैं काटो के सुझाव की कोशिश की और लिखा है:

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

यह काम करता है। हालांकि, सॉकेट.ऑन के साथ इतना नहीं। मेरी रणनीति है प्रत्येक कॉलबैक को 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]); 
} 

कोई भी इंगित कर सकता है कि बंदर पैचिंग सॉकेट.ऑन क्यों काम नहीं कर रहा है?

उत्तर

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

+4

मुझे खेद है कि इसके लिए केवल 1 अपवोट है। –

+0

शानदार, धन्यवाद – carpii

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' का उपयोग करने की भी आवश्यकता है। – clarkf

+0

दाएं; मैं स्पष्ट रूप से लागू/डिस्लेक्सिक कॉल कर रहा हूँ; मैं उन मॉनिटर के बगल में पोस्ट-इट पर उन दो और PHP के स्ट्रॉप्स/इन_एरे को डालने के बारे में सोच रहा हूं :) – Kato

+0

@ क्लर्क की टिप्पणियों के साथ अपडेट किया गया – Kato

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

सॉकेट.आईओ 1.3.7 में अच्छी तरह से काम करता है। – Connor

+1

यह काम करता है लेकिन यह सुनिश्चित करने के लिए सुनिश्चित करें कि 'var packet = packet.data;' फ़ंक्शन के अंदर, ऐसा करने से पैकेट "अमान्य" हो जाता है और कॉल फ़ंक्शन नहीं लगाया जाएगा। – Garre

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); 
संबंधित मुद्दे