我今天开始学习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);
}
});
....
答案 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
事件客户端,然后在有新连接的时候在服务器上发出它,以便不依赖于页面加载发送详细信息