nodejs和undefined变量,可能的范围问题

时间:2016-12-17 02:11:40

标签: javascript node.js

我今天开始学习Node JS并且已经开了一个聊天室。

当用户连接时,它会将用户信息发送到Node,并将其存储在名为user的var中,该变量是在io.on('connecting', function ...的匿名函数中创建的,因此我可以将它们的倍数用于多个用户(我认为这样可行)

当用户断开连接时,我会从其usersOnline

索引的user.id中删除其用户的对象

我一直收到这个错误,告诉我它未定义:

Error TypeError: Cannot read property 'id' of undefined at Socket.<anonymous> (/var/www/html/projects/hbc_chat/index.js:28:27)

错误是我使用delete usersOnline[user.id]

的地方

以下是代码:

// server user
    var srvUser = {
        id: 0,
        display_name: 'HabboCreate',
        fancy_display_name: 'HabboCreate',
        picture: 'http://www.habbocreate.com/userdata/uploads/2f48a19f199bb5f018b3089fd4967902'
    };
    var usersOnline = {};


io.on('connection', function(socket) {
    var user;

    socket.on('connected', function(userObj) {

        // store user
        user = userObj;
        // add to users online list
        usersOnline[user.id] = user;
        // send to clients
        updateUsersOnline();
        // send joined message
        sendMessage(srvUser, user.display_name + ' joined the chat');

        console.log(user.display_name + ' connected');      
    });

    socket.on('disconnect', function() {
        try {
            // remove their user from the online list
            delete usersOnline[user.id];
            // send to client
            updateUsersOnline();        
            // send left message
            sendMessage(srvUser, user.display_name + ' left the chat');
        }
        catch (err) {
            console.log('Error', err);
        }
    });
.... 

2 个答案:

答案 0 :(得分:0)

这似乎不是范围问题。 updateUsersOnline()是否可以更改用户信息?我刚刚运行了这个与你的代码非常相似的代码,没有错误:

var usersOnline = {};
io.on('connection', function (socket) {
  var user;
  socket.on('connected', function (userObject) {
    user = userObject;
    console.log('user: ' + JSON.stringify(user));
    usersOnline[user.id] = user;
    console.log(JSON.stringify(usersOnline) + '\n');
  });

  socket.on('disconnect', function () {
    try {
      console.log('user: ' + JSON.stringify(user));
      delete usersOnline[user.id];
      console.log(JSON.stringify(usersOnline) + '\n');
    } catch (err) {
      console.log('err: ' + err);
    }
  });
});

我在客户端&#39; connected&#39;中传递了这样创建的用户。事件:

var userObject = {
  id: new Date(),
  display_name: 'some_name',
};

my_connection.emit('connected', userObject);

连接事件后,我关闭了连接。这是服务器记录的内容:

user: {"id":"2016-12-17T04:49:05.123Z","display_name":"some_name"}
{"2016-12-17T04:49:05.123Z":{"id":"2016-12-17T04:49:05.123Z","display_name":"some_name"}}

user: {"id":"2016-12-17T04:49:05.123Z","display_name":"some_name"}
{}

没有错误,所以似乎有些东西正在移除用户对象或至少在连接和断开连接事件之间的id属性。

答案 1 :(得分:0)

是的,我已经弄清楚出了什么问题。

这是我在聊天室页面的地方,我会重新启动节点服务器,我的JavaScript不会发出用户详细信息(它只在加载时完成),所以当我去刷新或其他什么时,disconnect事件无法在user变量和错误

中找到信息

我的修复是创建一个request user事件客户端,然后在有新连接的时候在服务器上发出它,以便不依赖于页面加载发送详细信息