2013-02-27 3 views
0

Извините, что за неправильное название, но не удалось сделать его лучше. Итак, вот моя проблема: Я использую NodeJS и socket.IO. У меня есть система лобби для чего-то вроде игры. Вы создаете root, другие люди присоединяются и т. Д. Я хочу, чтобы владелец комнаты закрыл соединение, которое комната должна удалить сама. Я сделал это такСоединение NodeJS перед отключением

db.game.findOne({ _id: ObjectId(roomId) }, function(err, item) 
    { 
     if (err || !item || item.started) 
      return; 

     if (item.createdBy == currentUser) 
     { 
      db.game.remove({ _id: ObjectId(roomId) }, function(err, item) { 
       io.sockets.in(roomId).emit('force_interupt'); 
      }); 
     } 

и он работает, но у меня есть вопрос. Если человек просто нажимает REFRESH в браузере, веб-сервер (php, nginx, mongod) сначала получает содержимое игры -> показывает его, и после этого игра была удалена NodeJS, потому что соединение потеряно. Любые идеи, как я могу избежать этого?

ответ

0

Что вы ожидаете от жизненного цикла комнаты?

Если вы хотите закрыть комнату, когда соединение socket.io близко, у вас уже есть то, что вы хотите.

Если вы хотите закрыть комнату при истечении срока действия http-сеанса, вы должны запереть комнату до сеанса, что означает, что вам нужно сохранить информацию о номере в данных сеанса http и удалить комнату, когда сессия истекла.

Если вы хотите, чтобы закрыть комнату, когда socket.io закрытие соединения, если соединение близко не вызвано перезагрузки страницы или выдачи временной сети, вы можете сделать это:

  1. Определить команду «бросить курить» , На стороне клиента отправьте команду «quit» перед закрытием. На стороне сервера, если получена команда «quit», немедленно удалите комнату.
  2. Если соединение закрыто без команды «quit», держите комнату на некоторое время (например, 30 секунд). Если пользователь снова подключился до снятия комнаты, храните комнату. В противном случае удалите комнату.
+0

Каков наилучший способ отправить команду «выйти»? Я думал о onbeforeunload и onunload, но с onbeforeunload я могу получить возвращаемое значение подтверждения и с onunload. Я не могу остановить разгрузку. –

+0

Я бы предложил использовать кнопку «quit» для команды «quit». На мой взгляд, обновление страницы ничем не отличается от закрытия, а затем повторного открытия страницы. Итак, если обновление не удаляет помещение, закрытие страницы также не должно выходить из комнаты. – Chen

+0

Я понял, как это сделать, спасибо –

Смежные вопросы