Javascript SOCKET.IO-同一登录用户在两个不同浏览器中使用SOCKET.id

Javascript SOCKET.IO-同一登录用户在两个不同浏览器中使用SOCKET.id,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,这更多的是一个问题,即在您希望为一个用户触发一个套接字事件(可能已登录到另一个浏览器)的场景中,该怎么办 我有两个函数可以实时更新用户的工作进度(在其他用户可分配的其他工作进度队列中);但是,如果用户同时登录到另一个浏览器,并在一个浏览器中执行更新,则该浏览器不会在另一个浏览器中更新(因为他们具有不同的socket.id) 我不知道该怎么办。。。我可以根据登录者的用户ID进行操作,但目前我的套接字代码没有任何会话变量的作用域,尽管有会话套接字之类的模块,但我不确定这是否是正确的路径 有谁能给我一

这更多的是一个问题,即在您希望为一个用户触发一个套接字事件(可能已登录到另一个浏览器)的场景中,该怎么办

我有两个函数可以实时更新用户的工作进度(在其他用户可分配的其他工作进度队列中);但是,如果用户同时登录到另一个浏览器,并在一个浏览器中执行更新,则该浏览器不会在另一个浏览器中更新(因为他们具有不同的socket.id)

我不知道该怎么办。。。我可以根据登录者的用户ID进行操作,但目前我的套接字代码没有任何会话变量的作用域,尽管有会话套接字之类的模块,但我不确定这是否是正确的路径


有谁能给我一个建议吗?

如果你不使用任何集群,你可以遵循我在Miaou聊天中的方法:我只需将用户设置为socket对象的属性,并在必要时迭代socket。这允许一些实用功能

这是(简化的)相关代码

io.on('connect', function(socket){
    ...
    var userId = session.passport.user;
    if (!userId) return die("no authenticated user in socket's session");
    ...
    var shoe = new Shoe(socket, completeUser) // <=== bindind user socket here 

    // socket event binding here


现在,使用基于ES6的节点版本和WeakMap,我可能会实现更直接的映射,但我描述的解决方案足够健壮和高效。

我根据对您问题的理解回答了这个问题。如果我误解了,请告诉我,我会删除答案。
// A shoe embeds a socket and is provided to controlers and plugins.
// It's kept in memory by the closures of the socket event handlers
function Shoe(socket, completeUser){
    this.socket = socket;
    this.completeUser = completeUser;
    this.publicUser = {id:completeUser.id, name:completeUser.name};
    this.room;
    socket['publicUser'] = this.publicUser;
    this.emit = socket.emit.bind(socket);
}
var Shoes = Shoe.prototype;



// emits something to all sockets of a given user. Returns the number of sockets
Shoes.emitToAllSocketsOfUser = function(key, args, onlyOtherSockets){
    var currentUserId = this.publicUser.id,
        nbs = 0;
    for (var clientId in io.sockets.connected) {
        var socket = io.sockets.connected[clientId];
        if (onlyOtherSockets && socket === this.socket) continue;
        if (socket && socket.publicUser && socket.publicUser.id===currentUserId) {
            socket.emit(key, args);
            nbs++;
        }
    }
    return nbs;
}

// returns the socket of the passed user if he's in the same room
Shoes.userSocket = function(userIdOrName) {
    var clients = io.sockets.adapter.rooms[this.room.id],
        sockets = [];
    for (var clientId in clients) {
        var socket = io.sockets.connected[clientId];
        if (socket && socket.publicUser && (socket.publicUser.id===userIdOrName||socket.publicUser.name===userIdOrName)) {
            return socket;
        }       
    }
}

// returns the ids of the rooms to which the user is currently connected
Shoes.userRooms = function(){
    var rooms = [],
        uid = this.publicUser.id;
        iorooms = io.sockets.adapter.rooms;
    for (var roomId in iorooms) {
        if (+roomId!=roomId) continue;
        var clients = io.sockets.adapter.rooms[roomId];
        for (var clientId in clients) {
            var socket = io.sockets.connected[clientId];
            if (socket && socket.publicUser && socket.publicUser.id===uid) {
                rooms.push(roomId);
                break;
            }
        }   
    }
    return rooms;
}


// returns the first found socket of the passed user (may be in another room)
function anyUserSocket(userIdOrName) {
    for (var clientId in io.sockets.connected) {
        var socket = io.sockets.connected[clientId];
        if (socket.publicUser && (socket.publicUser.id===userIdOrName||socket.publicUser.name===userIdOrName)) {
            return socket;
        }
    }
}

// closes all sockets from a user in a given room
exports.throwOut = function(userId, roomId, text){
    var clients = io.sockets.adapter.rooms[roomId];;
    for (var clientId in clients) {
        var socket = io.sockets.connected[clientId];
        if (socket.publicUser && socket.publicUser.id===userId) {
            if (text) socket.emit('miaou.error', text);
            socket.disconnect('unauthorized');
        }
    }
}