不同路径下的多个socket.io实例

时间:2018-07-26 13:06:25

标签: node.js rest http socket.io

我正在制作一个REST API,它可以与诸如/api/route/action之类的路由和动作一起使用。但是我想添加WebSocket功能。所以我希望WebSockets也可以通过url寻址。

我有此代码:

const socketio = require('socket.io');

//server is a http.createServer()
module.exports = server => {
    const io = socketio(server, { route: '/socketapi/test' );
    io.on('connection', s => { 
        s.on('a', () => s.emit('b'));
        s.emit('message', 'You connected to /test.');
    });

    const io2 = socketio(server, { route: '/socketapi/something_else' });
    io2.on('connection', s => { 
        s.on('z', () => s.emit('y'));
        s.emit('message', 'Hi');
    });
};

我想要分割它们的原因是,这样我就不必跟踪已经使用的事件名称,因此可以在连接事件中分离逻辑。

但这似乎是不可能的。如果我有两个正在运行的socket.io实例,我将无法连接到任何一个。

这是否可能,或者我必须使用一些技巧,或者客户可以发送的事件让我知道它想要订阅什么?

1 个答案:

答案 0 :(得分:1)

您可以使用socket.io的内置功能(称为名称空间)来实现此功能。

这是一个基本示例:

服务器端:

const nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
  console.log('someone connected');
});
nsp.emit('hi', 'everyone!');

客户端

const socket = io('/my-namespace');

现在,客户端可以发出和接收特定于名称空间的消息。通过使用命名空间,将解决事件名称冲突的问题。