覆盖socket.io的发射和打开?

dis*_*dng 23 node.js socket.io

在开发过程中,能够很好地查看数据包到达和发送的内容对我有很大帮助.这可以在带有记录器的服务器端进行.但是,在客户端,没有记录器.我发现自己在整个地方乱扔垃圾.

是否可以使用console.log(参数)覆盖socket.emit和socket.on?如果我可以在我的套接字之前覆盖它,那将非常优雅.

有人建议我改写Parser.

你的2点是什么?

编辑

我尝试了加藤的建议并写了以下内容:

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

这有效.但是,与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]);
}
Run Code Online (Sandbox Code Playgroud)

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

nme*_*nme 58

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

以下示例适用于客户端和服务器端(在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);
  };
})();
Run Code Online (Sandbox Code Playgroud)

  • 太糟糕了,我们需要改变socket.io的工作方式来实现这一点.在我看来这是一个非常理想的功能. (2认同)

Ale*_*nts 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);
    };
Run Code Online (Sandbox Code Playgroud)