Javascript 事件断开
我正试图通过本法语教程学习nodejs,以便与nodejs聊天 但我找不到离开房间的用户 Server.jsJavascript 事件断开,javascript,node.js,Javascript,Node.js,我正试图通过本法语教程学习nodejs,以便与nodejs聊天 但我找不到离开房间的用户 Server.js var http = require('http'); httpServer = http.createServer(function(req, res){ // some magic }); httpServer.listen(1337); var io = require('socket.io').listen(httpServer); var users = {};
var http = require('http');
httpServer = http.createServer(function(req, res){
// some magic
});
httpServer.listen(1337);
var io = require('socket.io').listen(httpServer);
var users = {};
io.sockets.on('connection', function(socket){
var user = false;
for(var k in users){
socket.emit('newUser', users[k]);
}
socket.on('login', function(user){
user = user;
users[user.id] = user;
io.sockets.emit('newUser', user);
});
// HERE IS THE PROBLEM
socket.on('disconnect', function(){
console.log('LOGOUT');
console.log(user);
if(!user){
return false;
}
delete users[user.id];
io.sockets.emit('logout', user)
});
});
还有我的client.js
(function($){
var socket = io.connect('http://localhost:1337');
var rand = Math.floor((Math.random() * 1000) + 1);
socket.emit('login', {
id : rand,
username : 'Guest' + rand
})
socket.on('newUser', function(user){
$('#users').append('<li id="u'+ user.id +'"><a href="http://rencontre-ados.net/profil'+ user.id +'">'+ user.username + '</a></li>');
});
socket.on('logout', function(user){
$('#users #u'+ user.id).remove();
});
})(jQuery);
(函数($){
var socket=io.connect('http://localhost:1337');
var rand=数学地板((数学随机()*1000)+1);
socket.emit('login'{
id:rand,
用户名:'Guest'+rand
})
socket.on('newUser',函数(user){
$('#users')。追加(');
});
socket.on('logout',函数(用户){
$('#users#u'+user.id).remove();
});
})(jQuery);
当我断开与聊天室的连接时,注销会显示在我的控制台中,但用户为false,因此我无法从已连接用户列表中删除该id。您需要通过socket.id将用户保存在users in,因为您可以在断开连接事件中访问socket.id:
socket.on('login', function(user){
users[socket.id] = user; // <<<<< use socket.id
io.sockets.emit('newUser', user);
});
socket.on('disconnect', function(){
var user = users[socket.id]; // <<<< use socket.id
console.log('LOGOUT');
console.log(user);
io.sockets.emit('logout', user)
delete users[socket.id];
});
socket.on('login',函数(用户){
用户[socket.id]=user;//Change
到
您正在同一作用域内重新分配变量user
。您的目标是操纵父作用域。尝试在删除之前发出注销?@Pogrindis:same resultmove var user=false;超出作用域,以便在每个连接上都不会将其设置回false?同样的结果user是false:/it's's work.不确定to了解所有内容,但我会查看一些文档。谢谢,每个连接都有一个由socket.io生成的唯一id(socket.id),因此您可以非常安全地将socket.id用作用户Object的键。顺便说一句,对于newUser事件,将当前for循环替换为:Object.keys(users).forEach(函数(key){socket.emit('newUser',users[key]);};
user = user;
this.user = user;