节点 Socket.IO socket.on() 跨多个文件

Vla*_*vic 1 javascript sockets node.js socket.io

我在节点应用程序中使用 Socket.IO,我希望捕获并响应不同文件中的套接字事件,我该怎么做?

我找到的一个解决方案是在设置 socket.io 的文件中执行此操作:

var events = [];
module.exports.setup = (server) => {
  io = require('socket.io')(server);
  console.log("Socket.io setup complete");
  io.on('connection', (socket) => {
    for(let e of events){
      socket.on(e.event, e.callback);
    }
  });
};

module.exports.on = (event, callback) => {
  events.push({event: event, callback: callback});
};
Run Code Online (Sandbox Code Playgroud)

这工作得很好,唯一的问题是我无法到达套接字对象,因此我不知道哪个套接字发出了事件。

编辑

好吧,我想另一种方法是将 cb 中的套接字作为第一个参数传递,但也许有更好的方法。

jfr*_*d00 5

构建事物的方法有多种,具体取决于代码的结构方式以及您可能希望如何重用或构建模块。以下是一些选择:

  1. 传递io给每个想要侦听传入的 socket.io 事件的模块的构造函数,并让每个想要侦听消息的模块使用该io值创建自己的io.on('connection', socket => { socket.on('someMsg', localHandler)} );.

  2. 从主 socket.io 模块导出io,然后让每个想要侦听传入消息的模块import/require()主 socket.io 模块(以获取io值),然后使用该io值创建自己的io.on('connection', socket => { socket.on('someMsg', localHandler)} );.

  3. 让您的主 socket.io 模块导出一个函数,用于为传入的 socket.io 消息注册侦听器,然后在主 socket.io 模块中只有一个io.on('connection', ...)处理程序来侦听所请求的所有事件。