【问题标题】:Express - socket.io - session. Refer to user id as socket idExpress - socket.io - 会话。将用户 id 称为套接字 id
【发布时间】:2016-11-05 09:37:39
【问题描述】:

我正在使用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 指定套接字?我对所有这一切都没有经验,因此对任何重大错误感到抱歉。谢谢

【问题讨论】:

  • 你可以像var session_id = socket.handshake.session.id这样获取会话ID(你需要把它放在你的io.on('connection....)方法中。
  • @DavidR 但我可以根据需要指定用户吗?这样我就可以按照我想要的方式指定套接字,我是否必须在他登录时将 user_id 添加到套接字方法中,然后每次我想向特定用户发送信息时检查哪个对象具有正确的 user_id 并使用套接字与其关联的 id 以发出它?

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


【解决方案1】:

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

socket.join(socket.id);

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

//or

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

【讨论】:

  • 您可能更喜欢使用socket.to(socket.id).emit('to_do', info); 而不是io.sockets.in(socket.id).emit('to_do', info);,因为这会自动从发出事件的接收者中排除当前套接字。
【解决方案2】:

我通过遍历客户端列表并查看哪个拥有我想要的套接字来解决这个问题

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-27
      • 2016-04-06
      • 1970-01-01
      • 2021-12-26
      • 2012-09-27
      • 2021-12-29
      • 1970-01-01
      • 2020-11-11
      • 2017-08-23
      相关资源
      最近更新 更多