Socket.IO服务器端多个文件

问题描述 投票:0回答:1

我有一个nodejs后端和一个React前端。在nodejs上,我设置了socketio,在客户端上,我在App组件中具有连接,并使用上下文向下传递。现在,使用钩子,我可以全局使用io变量,并在客户端侦听事件。

但是,在服务器端,我也可以全局使用此IO变量,但是如何在多个页面上使用它呢?我在server.ts中有此代码:

const io = //initialize io
io.on('connection', (socket: any) => {
    console.log('a user connected', socket.handshake.query);

    socket.on('disconnect', () => {
        console.log('user disconnected');
    });

    io.on('test', console.log);
});

但是,在另一个文件中,我必须再次使用io.on()初始化我的连接。如何解决这个问题?我有一个名为foo.controller.ts的文件,它在foo周围有一些动作。在此文件中,我想监听与foo相关的所有事件。

node.js socket.io
1个回答
0
投票

创建新文件,例如socket.instance.js,然后创建类来处理所有套接字的逻辑,例如存储套接字列表或其他内容(取决于您的需要);

这里是socket.instance.js的示例:

class SocketInstance {
  io = require('socket.io')();
  sockets = new Set();

  constructor() {
    this.io.listen(process.env.PORT);

    this.io.on('connect', socket => {
      this.sockets.add(socket);

      this.handleNewSocket(socket);

      socket.on('disconnect', () => {
        this.sockets.delete(socket);
      })
    });
  }

  handleNewSocket(socket) {
    // logic here
  }
}

const socketInstance = new SocketInstance();

module.exports = {socketInstance}

然后在任何其他文件中,您都可以像这样访问此实例:

// anotherServerFile.js
const socketInstance = require('./socket.instance').socketInstance;

socketInstance.io.emit('hello');

这只是基本示例,说明如何在代码中的任何其他类/文件之间共享套接字服务器实例。一切都取决于您的需求

与前端情况有些相似

© www.soinside.com 2019 - 2024. All rights reserved.