【问题标题】:NodeJS connection before disconnect断开连接前的NodeJS连接
【发布时间】:2013-02-27 16:32:36
【问题描述】:

首先很抱歉标题被误解了,但不能让它变得更好。 所以这是我的问题: 我正在使用 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 删除,因为连接丢失。 有什么办法可以避免这种情况吗?

【问题讨论】:

    标签: node.js connection webserver


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 发送“退出”命令的最佳方式是什么?我考虑过 onbeforeunload 和 onunload,但是使用 onbeforeunload 我可以获得确认的返回值,使用 onunload 我无法停止卸载
    • 我建议对“退出”命令使用“退出”按钮。在我看来,刷新页面与关闭然后重新打开页面没有什么不同。所以,如果刷新没有删除房间,关闭页面也不应该删除房间。
    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多