【问题标题】:Socket.io : How do I handle all incoming messages on the server?Socket.io:如何处理服务器上的所有传入消息?
【发布时间】:2012-01-25 10:30:10
【问题描述】:

我希望能够在单个处理程序中处理来自客户端的所有消息。

示例客户端代码:

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 的名称发送的。这可能吗?

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

【问题讨论】:

标签: node.js socket.io


【解决方案1】:

这可以通过重写 socket.$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));       
};

【讨论】:

  • 这是否适用于传入消息,因为从函数名称来看,它表明它是用于传出消息的函数?
【解决方案2】:

使用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();
 });
});

【讨论】:

    【解决方案3】:

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

    这个时候,如果你真的需要它,你可能不得不 fork Socket.IO。请参阅3rd-Edens comment 了解如何操作。

    【讨论】:

    • 嗯,这绝对不是我想要的答案。
    • 我也不是,但这就是目前的情况。另一方面,对 3rd-Edens 注释的更改只有 3-5 行,应该很容易实现。
    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2021-06-13
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多