Socket.io:如何处理服务器上的所有传入消息?

时间:2012-01-25 10:30:11

标签: node.js socket.io

我希望能够处理从单个处理程序中的客户端传入的所有消息。

示例客户端代码:

var socket = io.connect('http://localhost');
socket.emit('news', { hello: 'test' });
socket.emit('chat', { hello: 'test' });

示例服务器代码:

io.sockets.on('connection', function (socket) {
socket.on('message', function (data) {
    console.log(data);
}); });

我希望能够记录每条消息,即使它是使用emit发送的新闻,聊天或其他任何名称。这可能吗?

注意:上述服务器代码不起作用。目前没有任何记录。我只是想知道是否有一个事件可以处理每个发射名称的所有消息。

3 个答案:

答案 0 :(得分:6)

可以通过覆盖套接字。$ emit 功能

来实现
//Original func
var x = socket.$emit;

socket.$emit = function(){
     var event = arguments[0];
     var feed  = arguments[1];

     //Log
     console.log(event + ":" + feed);

    //To pass listener  
    x.apply(this, Array.prototype.slice.call(arguments));       
};

答案 1 :(得分:1)

这是一个带有Socket.IO的open issue

此时,如果你确实需要它,你可能需要分叉Socket.IO。有关如何操作,请参阅3rd-Edens comment

答案 2 :(得分:0)

使用 socket.onAny(listener) 在 Socket.Io >3 上更容易:

this.socket.onAny(m => {
    ..
});

现在从 Socket-io 2.0.4 开始支持开箱即用,您只需要注册一个中间件(来自 socketio-wildcard 的来源):

<块引用>

从 Socket.io v2.0.4 (commit) 开始,您可以使用套接字中间件来 捕获每个传入的数据包,满足大多数 socketio-wildcard 的用例。

io.on('connection', (socket) => {
  socket.use((packet, next) => {
   // Handler
   next();
 });
});