事件断开

时间:2014-06-21 13:07:31

标签: javascript node.js

我正在尝试使用此法语教程学习nodejs,以便与nodejs进行聊天https://www.youtube.com/watch?v=8jkkd2Ohte8

但我不能让离开房间的用户。

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);

当我断开聊天时,我的控制台会显示LOGOUT,但用户 false ,因此我无法从已连接用户列表中删除该ID。

2 个答案:

答案 0 :(得分:1)

您需要通过socket.id将用户保存在用户中,因为您可以在disconnect事件中访问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];
});

答案 1 :(得分:0)

更改

user = user;

this.user = user;

您正在同一范围内重新分配变量user。您的目标是操纵父范围。