我正在使用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')
})
找到有效,直到我尝试重新启动聊天服务器。
仅在创建房间时才发生仅保存在RAM中的房间的命名空间,因此,当我重新启动服务器并尝试加入房间时,会发生“无效的命名空间”错误。
所以当用户加入会议室时,我尝试了以下代码段。
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)
})
})
}
如果需要更多信息,请告诉我。
谢谢。