динамический чат с io.of () - PullRequest
0 голосов
/ 23 апреля 2019

Я делаю чат-сервер с 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)
    })
  })
}

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...