Express - socket.io - session。将用户ID称为套接字ID

时间:2016-11-05 09:37:40

标签: javascript node.js sockets session socket.io

我正在使用express-socket.io-session。我想我可以通过查看教程来设置基本配置:

//BASIC CONFIG?

var clients = [];

var session = require("express-session")({
    secret: 'some key',
    resave: true,
    saveUninitialized: true
});
var sharedsession = require("express-socket.io-session");
app.use(session);

io.use(function(socket, next){
   next();
});

io.use(sharedsession(session, {
  autoSave:true
})); 

io.on('connection', function(socket) {

    console.log("CLIENT CONNECTED");
    var session = socket.handshake.session;
    clients.push(socket);

    socket.on('disconnect', function() {
       console.log("CLIENT DISCONNECTED");
    });

});

我现在想要做的是引用特定的客户端套接字而不是套接字,而是引用应该分配给该套接字的会话ID。当用户登录时会发生这种情况:

req.session.user_id = user_id; 
//(user_id is equal to DB {0,1,2,3...} ids

当我这样做时,我能够将套接字发送给特定的客户端:

clients[0].emit("to_do",info); // I don't know who is client index 0 compared to the login reference...

我希望能够做到这一点或类似:

user_id = 3; // which would have a socket assigned

clients(user_id).emit("to_do",info);

这意味着每个客户端都有一个分配给其先前分配的ID的套接字。我怎么能这样做,所以我可以通过该id指定套接字?我对所有这些都没有经验,对任何重大错误都很抱歉。感谢

3 个答案:

答案 0 :(得分:1)

我通过遍历客户端列表并查看哪个具有我想要的套接字

来解决这个问题

答案 1 :(得分:1)

您的问题可以通过每个套接字加入一个以它命名的组来解决:

socket.join(socket.id);

io.sockets.in(socket.id).emit('to_do', info);

//or

io.sockets.in(clients[0].id).emit('to_do', info);

答案 2 :(得分:0)

我遇到了类似的问题,当使用 express-socket.io-session 时,socket.handshake.session.passport 中的用户 ID 在新用户登录时发生变化,我使用以下方法解决。

    var userID;
    if (!userID){
        userID = socket.handshake.session.userID = socket.handshake.session.passport['user'];
        }