【问题标题】:Multiple socket.io instances at different paths不同路径的多个 socket.io 实例
【发布时间】:2018-07-26 21:16:15
【问题描述】:

我正在制作一个 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 实例正在运行,我无法连接到任何一个。

这可能吗,还是我必须使用一些技巧,也许客户端可以发送一个事件让我知道它想要订阅什么?

【问题讨论】:

    标签: node.js rest http socket.io


    【解决方案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');
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-12
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2019-12-22
      相关资源
      最近更新 更多