Socket.io's emittieren und weiter?
Frage
Während der Entwicklung hilft es mir sehr, zu sehen, welche Pakete ankommen und gesendet werden.Dies ist serverseitig mit Logger möglich.Auf der Client-Seite gibt es jedoch keinen Logger.Ich finde mich überall auf der Konsole wieder.
Ist es möglich, socket.emit und socket.on mit console.log (Argumente) zu überschreiben?Wenn ich dies vor meiner Steckdose überschreiben kann, wäre es wirklich elegant.
Jemand hat mir geraten, stattdessen den Parser zu überschreiben.
Was sind deine 2 Cent dazu?
EDIT
Ich habe Katos Vorschlag ausprobiert und Folgendes geschrieben:
var _origEmit = socket.emit;
socket.emit = function() {
console.log("SENT", Array.prototype.slice.call(arguments));
_origEmit.call(socket, arguments);
};
Das funktioniert.Allerdings nicht so sehr mit socket.on.Meine Strategie ist es, jeden Rückruf mit einem console.log zu versehen.Wenn Sie Python kennen, ist es so, als würden Sie Funktionsdekoratoren auf die Rückrufe setzen, mit denen console.log die Argumente protokolliert.
(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]);
}
Kann jemand darauf hinweisen, warum Monkey Patching Socket.on nicht funktioniert?
Lösung
Um socket.on zu überschreiben, müssen Sie tatsächlich socket. $ emit . überschreiben
Das folgende Beispiel funktioniert sowohl clientseitig als auch serverseitig (getestet auf 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);
};
})();
Andere Tipps
Funktioniert, getestet:
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);
};
Es gibt ein Modul namens socket.io-wildcard , mit dem Platzhalter auf Client und Server verwendet werden könnenSeite, keine Notwendigkeit mehr, etwas zu überschreiben
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>