【发布时间】:2019-06-23 23:27:09
【问题描述】:
我有一个使用 Socket.io 的 React 应用程序。我使用默认命名空间/ 和自定义命名空间/test。我需要能够从一个命名空间发射到另一个命名空间,但我只设法让它从自定义到默认工作。
在客户端,事件监听器位于根目录 (App.js):
componentDidMount() {
socket.on('test_listener', (data) => {
// Some code
})
}
使用redux初始化连接:
import socketIOClient from 'socket.io-client';
const initialState = {
initializeSocket: socketIOClient('http://localhost:3000/'),
...
}
在服务器端,代码如下:
io.on('connection', function (socket) {
socket.on('something', (data) => {
io.of('/test').emit('test_listener', data); // Not working
socket.broadcast.emit('test_listener', data); // Is working
})
});
我确信io.of('namespace').emit('event_name', data); 应该可以正常工作,因为它在Socket.io's Emit cheatsheet 中已解决。并且客户端的事件监听器正在工作,因为我得到了 broadcast.emit 的一些东西。
另外,我可以使用以下代码从/test 发射到/:
socket.on('join_namespace_test', data => {
// [...] Some code to check if the namespace exists
io.of('/test').on('connection', function (nspSocket) {
nspSocket.on('do_something', (data) => {
io.of('/').emit('another_action', data); // This one is working fine
})
})
// [...] Some code to add the user to the namespace /test (switching from default)
}
知道为什么从/ 到/test 的发射不起作用吗?
我没有收到任何错误,没有任何反应。
编辑:经过进一步研究,我发现this post:
您不能在现有连接上“切换”命名空间。建立连接后,您将连接到特定的命名空间,一旦建立,就无法更改。
为了确保问题不是来自项目的其他部分,我在小提琴上重现了这个问题。从默认到自定义的发出仍然不起作用,我还注意到broadcast 在客户端从默认切换到自定义然后返回默认时有一个奇怪的行为(它不应该发送给发件人) .
所以,考虑到问题可能是客户端在默认命名空间和自定义命名空间之间切换的方式而不是发射本身,也许房间会是一个更好的选择?或者我应该在切换之前找到一种方法来断开连接,但是否推荐?
【问题讨论】: