题
在开发过程中,能够看到哪些数据包到来并发送了,这对我有很大帮助。使用Logger在服务器端可以使用。但是,在客户端,没有记录器。我发现自己在整个地方都在乱扔垃圾控制台。
是否可以使用Console.Log(参数)覆盖套接字。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包裹。如果您知道Python,这就像将功能装饰符放在委托的回调上。
(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.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);
};
})();
其他提示
作品,测试:
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>
不隶属于 StackOverflow