Я делаю чат-сервер с socket.io.
Когда пользователь создает чат-комнату, тогда
socket.on('create', data => {
room.to(mainPage).emit('message', data.roomId)
require('./channals')(io, data.roomId)
console.log(JSON.stringify(data) + 'room is created')
})
Он работал, пока я не попытался перезапустить чат-сервер.
Пространство имен комнаты, сохраненное только в оперативной памяти, и событие «создать» происходит только при создании комнаты, поэтому при перезапуске сервера и попытке присоединиться к комнате возникает ошибка «Недопустимое пространство имен».
Итак, япопробовал приведенный ниже фрагмент кода, когда пользователь присоединяется к комнате.
socket.on('joinChannal', data => {
require('./channals')(io, data.roomId)
console.log(`Joined in ${data.roomId} `)
})
Но при каждом событии, когда пользователь присоединяется к комнате, создается сокет.
Сначала я проверяюпосещение и если первое посещение, то создайте новый сокет, если нет, ничего не делайте.
пример:
const rooms = new Set()
// ...
socket.on('joinChannal', data => {
if (rooms.has(data.roomId)) { // do nothing. }
else { rooms.add(data.roomId); require('./channals')(io, data.roomId) }
})
// ...
Правильный ли я подход?
Вот мойкод.
module.exports = (io, roomId) => {
const room = io.of(`/${roomId}`)
const pageName = roomId
room.on('connection', socket => {
room.clients((err, clients) => {
if (err) throw err
console.log(clients)
})
socket.on('join', data => {
socket.join(pageName)
})
// @params: data: {roomId: string, msg: string}
socket.on('create', data => {
room.to(pageName).emit('message', data)
})
socket.on('leave', () => {
socket.leave(pageName)
})
socket.on('disconnect', () => {
socket.disconnect(true)
})
socket.on('error', err => {
console.log(err)
socket.disconnect(true)
})
// @params: data: {roomId: string, userId: number}
socket.on('joinToWrite', data => {
room.to(pageName).emit('message', data)
})
})
}
module.exports = io => {
const room = io.of('/mainpage')
const mainPage = 'mainpage'
let sockets = []
room.on('connection', socket => {
sockets.push(socket)
socket.on('join', () => {
socket.join(mainPage)
})
socket.on('create', data => {
room.to(mainPage).emit('message', data.roomId)
require('./channals')(io, data.roomId)
})
socket.on('joinChannal', data => {
require('./channals')(io, data.roomId)
})
socket.on('leave', () => {
sockets.splice(sockets.indexOf(socket), 1)
socket.leave(mainPage)
})
socket.on('disconnect', () => {
sockets.splice(sockets.indexOf(socket), 1)
socket.leave(mainPage)
})
socket.on('error', err => {
console.log(err)
})
})
}
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Спасибо.