如何向特定的客户端发送javascript对象的属性名

如何向特定的客户端发送javascript对象的属性名,javascript,node.js,object,for-loop,socket.io,Javascript,Node.js,Object,For Loop,Socket.io,我有一个对象var usernames={} 登录客户端向服务器发送addUser后 socket.on('addUser', function(data) { if (usernames[data] == undefined) { socket.username = data; username = socket.username; usernames[username] = socket.id; } } 我正在将每个客户机

我有一个对象
var usernames={}
登录客户端向服务器发送addUser后

socket.on('addUser', function(data) { 
    if (usernames[data] == undefined) { 
        socket.username = data;
        username = socket.username;
        usernames[username] = socket.id;
    }
}
我正在将每个客户机添加到我的对象中,并希望向该客户机发送消息。我在做这样的事情:

 socket.on('disconnect', function() {  
        dbConnection.query('DELETE FROM active_users WHERE login="' + username + '" AND socket_id="' + socketId + '"');
        delete usernames[socket.username];
        delete io.sockets.sockets[username];
        socket.leave(socket.room);                 

        for (var prop in usernames) {
            usernames[prop].emit('updateChat', usernames[prop] + ' has left the room');  
        }
    });
它不起作用。我希望实现类似-->的效果,但在这些示例中,作者使用数组。我必须使用对象,有什么想法吗

客户

socket.on('updateChat', function(data) { 
    $('<p>' + data + '</p>').appendTo($('#conversation'));   
});
socket.on('updateChat',函数(数据){
$(“”+数据+”

)。附录($(“#对话”); });
获取错误


TypeError:对象fI7dpiwjMzkD0tN69C6c没有方法“emit” 在插座上。(C:\Users\User\app\server.js:135:17) 在Socket.EventEmitter.emit[as$emit](events.js:95:17) 在Socket.onDisconnect(C:\Users\User\app\node\u modules\Socket.io\lib\sock et.js:153:10) 在SocketNamespace.handleDisconnect(C:\Users\User\app\node\u modules\socke t.io\lib\namespace.js:229:46) 在Manager.onClientDisconnect(C:\Users\User\app\node\u modules\socket.io\l ib\Manager.js:501:29) 在WebSocket.Transport.end(C:\Users\User\app\node\u modules\socket.io\lib\Transport.js:467:20) 在WebSocket.Transport.onSocketEnd(C:\Users\User\app\node\u modules\socket.io\lib\Transport.js:147:8) 位于Socket.EventEmitter.emit(events.js:117:20) at_stream_readable.js:920:16 在进程中。_tickCallback(node.js:415:13)DEBUG:Program node server.js退出,代码为8


我认为你需要做的是:

 for (var prop in usernames) {
     usernames[prop].emit('updateChat', usernames[prop] + ' has left the room');
 }
发出用户名。

的最后一行

更新1

socket.on('addUser', function(data) { 
    if (usernames[data] == undefined) { 
        socket.username = data;
        username = socket.username;
        usernames[username] = socket.id;
    }
}
应该是:

socket.on('addUser', function(data) { 
    if (usernames[data] == undefined) { 
        socket.set("username", data);
        //use getters and setters
        username = data;
        usernames[username] = socket.id;
    }
}
这将解决未定义的用户名问题

更新2

socket.on('disconnect', function() {  
    dbConnection.query('DELETE FROM active_users WHERE login="' + username + '" AND socket_id="' + socketId + '"');
    var un=socket.username;
    delete usernames[socket.username];
    delete io.sockets.sockets[username];
    socket.leave(socket.room); 
    for(var prop in usernames)
        if(io.sockets.socket(usernames[prop]).emit)
            io.sockets.socket(usernames[prop]).emit('updateChat', un + ' has left the room');
});
原始答案应修改为:

socket.on('disconnect', function() {  
    var un=socket.get('username');
    //use the getter appropriately

    dbConnection.query('DELETE FROM active_users WHERE login="' + un + '" AND socket_id="' + usernames[un] + '"');

    delete usernames[un];
    socket.leave(socket.room);
    //Leave before you remove your own connection

    delete io.sockets.sockets[usernames[un]];

    for(var prop in usernames)
        if(io.sockets.sockets[usernames[prop]].emit)
            io.sockets.sockets[usernames[prop]].emit('updateChat', un + ' has left the room');
});
用户名中的所有人发送

虽然如果您只使用以下工具,生活会轻松得多:

socket.broadcast.emit('updateChat', un + " has left the room.");

我更新了我的代码,现在你可以看到更多。当我断开连接时,我得到一个错误“Object…(这里是socket.id)没有方法'emit'”。用户名的每个属性都有一个emit方法吗?没有。看看代码,我又升级了。每个客户都应该收到一条信息,说明特定用户已离开房间。无人获取,无任何事件您在控制台中看到了什么吗?类型错误:对象fI7dpiwjMzkD0tN69C6c在套接字处没有方法“emit”。(C:\Users\User\app\server.js:135:17)在Socket.EventEmitter.emit[as$emit](events.js:95:17)在Socket.ondisconnect然后每个客户端获得两次“undefined has left the room”
Socket。用户名
未定义。我认为您在上游遇到了问题。请尝试在服务器端代码中注册用户。当我使用我的用户名变量(socket.username=data;username=socket.username;)时,用户名没有问题,但它仍然向每个客户端发送与添加的客户端数量相同的消息。因此,当我有3个用户,其中一个已经离开时,另外两个在socket.get(C:\users\User\app\node\u modules\socket.io\lib\stores\memory.js:86:3)在socket(C:\users\User\app\node\u modules\socket.io\lib\socket.js:258:14)在Client.get(C:\users\User\app\node\u modules\socket\socket.io\lib\socket.js)上没有。(C:\Users\User\app\server.js:115:19)在SocketNamespace.handleDisconnect(C:\Users\User\app\node\modules\Socket.io\lib\sock et.js:153:10)在SocketNamespace.handleDisconnect(C:\Users\User\app\node\modules\socke t.io\lib\namespace.js:229:46)在Manager.onClientDisconnect