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

发布于 2024-12-28 15:24:46 字数 475 浏览 1 评论 0原文

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

示例客户端代码:

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);
}); });

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

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

I want to be able to handle all messages that are coming in from clients in a single handler.

Example client code:

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

Example server code:

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

I'd like to be able to log every message even if its sent on news, chat or whatever other name using emit. Is this possible?

Note: The above server code does not work. There is nothing currently logged. I am just wondering if there is a single event which could be handled for all messages for every emit name.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情场扛把子 2025-01-04 15:24:46

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

That is possible by overriding socket.$emit function

//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));       
};
兔姬 2025-01-04 15:24:46

在 Socket.Io >3 上使用 < code>socket.onAny(listener)

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

从 Socket-io 2.0.4 开始就支持这种方式,你只需要注册一个中间件(来源自 socketio-wildcard):

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

io.on('连接', (socket) => {
  socket.use((数据包,下一个) => {
   // 处理程序
   下一个();
 });
});

It's even easier on Socket.Io >3 using the socket.onAny(listener):

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

This is supported out of the box now as of Socket-io 2.0.4, you simply need to register a middle ware (source from 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();
 });
});
才能让你更想念 2025-01-04 15:24:46

这是 Socket.IO 的未解决的问题

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

This is an open issue with Socket.IO.

At this time, if you really need it, you will probably have to fork Socket.IO. See 3rd-Edens comment for how to do it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文