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

12
我想要能够在一个单一的处理程序中处理来自客户端的所有消息。
示例客户端代码:
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发送的新闻、聊天或其他名称。这是否可能?
注意:上面的服务器代码不起作用,目前没有任何日志记录。我只是想知道是否有一个单一的事件可用于处理所有消息,无论使用哪个emit名称。

也许这个链接可以帮到你 => https://dev59.com/h1vUa4cB1Zd3GeqPt3Yl#7491506? - Alfred
请查看此处的解决方案:https://dev59.com/bmoy5IYBdhLWcg3wA5aC#9674248 - Brad
3个回答

5
那可以通过重写 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));       
};

这个函数是否适用于接收到的消息,因为从函数名称来看,它似乎是一个用于发送消息的函数? - mtsr

2

使用socket.onAny(listener)在Socket.Io >3上更加简单:

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

现在,从Socket-io 2.0.4开始,这已经被默认支持了,您只需注册一个中间件即可(源自socketio-wildcard):

As of Socket.io v2.0.4 (commit), you can use a socket middleware to catch every incoming Packet, which satisfies most of socketio-wildcard's use cases.

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

0

这是一个与 Socket.IO 相关的 未解决问题

目前,如果你真的需要它,你可能不得不 fork Socket.IO。请参考3rd-Edens comment了解如何操作。


2
这绝对不是我所期望的答案。 - Joshua
我也不知道,但这是目前的情况。另一方面,来自第三个评论的更改只有3-5行,应该很容易实施。 - mtsr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接