我正在制作一个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实例,我将无法连接到任何一个。
这是否可能,或者我必须使用一些技巧,或者客户可以发送的事件让我知道它想要订阅什么?
答案 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');
现在,客户端可以发出和接收特定于名称空间的消息。通过使用命名空间,将解决事件名称冲突的问题。