【问题标题】:Socket attributes undefined on disconnect断开连接时未定义的套接字属性
【发布时间】:2015-08-24 05:09:02
【问题描述】:

我正在使用 socket.io、express 和 nodejs 创建一个聊天室。到目前为止,登录、注销和消息事件工作正常。但是,访问断开连接的客户端的“用户 ID”属性会给我一个未定义的错误。我在服务器上存储了一个用户列表,如果离线,则将其状态设置为 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)

【问题讨论】:

  • 你在哪里设置userid
  • @mscdex,我在登录时分配了 socket.userid,它被(成功地)用于聊天事件和注销。似乎内置的socket.id在断开连接后可用,我想知道我是否只需要在某处存储socket.ids到用户名的映射

标签: node.js socket.io undefined disconnect


【解决方案1】:

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

我仍然需要了解第二个套接字的用途(或者弄清楚我是如何意外创建它的),但现在我已经通过检查断开连接的套接字是否具有用户 ID 来解决问题属性,然后再执行其余的注销逻辑。

编辑:

那个问题的根源是我有两个

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

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

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多