我正在制作一个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');
现在,客户端可以发出和接收特定于命名空间的消息。使用名称空间可以解决事件名称冲突的问题。