Javascript 事件断开

Javascript 事件断开,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 = {};

我正试图通过本法语教程学习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 = {};

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;