У меня есть приложение React, использующее Socket.io.Я использую пространство имен по умолчанию /
и пользовательское пространство имен /test
.Мне нужно иметь возможность передавать из пространства имен в другое, но мне удалось только заставить его работать от обычая до значения по умолчанию.
На стороне клиента прослушиватель событий находится в корне (App.js
):
componentDidMount() {
socket.on('test_listener', (data) => {
// Some code
})
}
Соединение инициализируется с помощью приращения:
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
})
});
Я точно знаю, что *Предполагается, что 1015 * будет работать так, как это указано в файле Emit Socket.io Emit .И прослушиватель событий на стороне клиента работает, так как я получаю что-то с 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)
}
Есть идеи, почему не работает emit от /
до /test
? Я не получаю никакой ошибки, ничего не происходит.
Редактировать: после дальнейших исследований я обнаружил этот пост :
Вы не можете "переключать" пространства имен в существующем соединении.Вы подключаетесь к определенному пространству имен, когда соединение установлено и однажды установлено, его нельзя изменить.
Чтобы быть уверенным, что проблема не связана с другой частью проекта, я воспроизвел еевопрос на скрипке.Излучение от обычного к обычному все еще не работает, и я также заметил, что broadcast
ведет себя странно, когда клиент переключается с обычного на пользовательский и затем возвращается к стандартному (он отправляет отправителю, а это не должно).
Итак, учитывая тот факт, что проблема может заключаться в том, что клиент переключается между стандартным и настраиваемым пространством имен, а не самим emit, возможно, комнаты будут лучшим вариантом?Или, может быть, я должен найти способ сбросить соединения перед переключением, но рекомендуется ли это?