2013-02-27 148 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'命令。在服務器端,如果收到「退出」命令,請立即移除該房間。
  2. 如果連接在沒有「退出」命令的情況下關閉,請保留一段時間(例如30秒)。如果在房間拆除之前用戶重新連接,請保留房間。否則,請刪除房間。
+0

發送「退出」命令的最佳方式是什麼?我想到onbeforeunload和onunload,但與onbeforeunload我可以得到確認的返回值和onunload我不能停止卸載 – 2013-02-28 14:49:00

+0

我會建議使用'退出'按鈕'退出'命令。在我看來,刷新頁面與關閉然後重新打開頁面沒什麼兩樣。所以,如果刷新不能移除房間,關閉頁面也不應移除房間。 – Chen 2013-02-28 15:04:57

+0

我想出瞭如何做到這一點,謝謝 – 2013-02-28 15:08:23