0

首先抱歉标题被误解了,但不能让它变得更好。所以这是我的问题:我正在使用 NodeJS 和 socket.IO。我有一个大厅系统,用于游戏之类的东西。您创建 root,其他人加入等。我希望当房间的所有者关闭连接时,房间应该自行删除。我是这样做的

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 删除,因为连接丢失。有什么想法可以避免这种情况吗?

4

1 回答 1

0

您对房间的生命周期有何期望?

如果你想在 socket.io 连接关闭时关闭房间,你已经得到了你想要的。

如果你想在 http session 过期时关闭房间,你应该将房间连接到 session,这意味着你需要将房间信息保存在 http session 数据中,并在 session 过期时删除房间。

如果你想在 socket.io 连接关闭时关闭房间,除非连接关闭是由于页面重新加载或临时网络问题引起的,你可以这样做:

  1. 定义一个“退出”命令。在客户端,关闭前发送“退出”命令。在服务器端,如果收到“退出”命令,立即移除房间。
  2. 如果连接在没有“退出”命令的情况下关闭,请保留空间一段时间(例如 30 秒)。如果用户在房间被移除之前重新连接,则保留房间。否则,删除房间。
于 2013-02-28T01:53:29.507 回答