我正在制作一个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实例正在运行,我也无法连接到其中任何一个。
这是可能的,还是我必须使用一些技巧,也许是一个事件,客户可以发送,让我知道它想订阅什么?

最佳答案

您可以使用名为命名空间的内置特性来实现此行为。
下面是一个基本示例:
服务器端:

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

客户端:
const socket = io('/my-namespace');

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

09-30 10:18