断开连接时未定义套接字属性

Socket attributes undefined on disconnect

我正在使用 socket.io、express 和 nodejs 创建一个聊天室。到目前为止,登录、注销和消息事件都运行良好。但是,访问断开连接的客户端的 'userid' 属性会给我一个未定义的错误。我在服务器上存储了一个用户列表,如果离线则将他们的状态设置为 0。

"use strict";

var express = require('express');
var app = express();
app.use(express.static(__dirname + '/client'));
var server = require('http').createServer(app);
var io = require('./node_modules/socket.io').listen(server);

var users = [];
var messages = [];

io.sockets.on('connection', function(socket) {       

    // various event functions

    socket.on('logout', function(fn){
        var username = socket.name;
        fn('true');

        users[socket.userid].status = 0; // 0: OFFLINE

        socket.emit('leave lobby', function(data){
            console.log(data);
        });

        messages.push( 
        {
            id: -1, // -1 indicates a server message
            message: username + " left the room"
        });

        socket.broadcast.to('lobby').emit('user logout', users, messages);
    });

    socket.on('disconnect', function(){
        var username = socket.name;

        users[socket.userid].status = 0; // 0: OFFLINE

        messages.push( 
            {
                id: -1, // -1 indicates a server message
                message: username + " left the room"
            });

        socket.broadcast.to('lobby').emit('user logout', users, messages);
    });
});

正常注销工作正常,但退出浏览器会出现此错误:

TypeError: Cannot set property 'status' of undefined

我已经看到其他一些讨论此问题的线程,但我找到的解决方案似乎无法解决此问题。 (这是使用 Express 4.13.3 和 Socket.io 1.3.6)

好的,我找到了问题的根源。日志记录 io.sockets.connected 显示显然正在为连接到我的服务器的每个客户端创建两个套接字。这些套接字中只有一个实际发出事件,因此就是那个被分配了用户标识和名称的套接字。因为两个套接字同时断开连接,所以如果我尝试访问它的 userid 属性,第二个套接字会抛出错误。

我仍然需要了解第二个套接字的用途(或者弄清楚我是如何不小心创建它的),但现在我已经通过检查断开连接的套接字是否有在执行其余注销逻辑之前的 userid 属性。

编辑:

问题的根源是我有两个

<script src="/socket.io/socket.io.js"></script>

在我的 index.html 中。叹息...