如何获取其他用户的 socket.id?

Jac*_*ovi 2 node.js express socket.io

如何获取其他用户的 socket.id?

由于 socket.id 不断变化,每当浏览器刷新或断开连接时,都会再次连接。

例如这行代码将解决我的问题

socket.broadcast.to(id).emit('my message', msg);

但问题是我如何获得那个 id?

假设杰克想向约拿发送消息

Jack 会使用上面的代码来发送消息,但是如何获取 Jonah 的 socket id 呢?

只是为了记录,我已经实现了socket.iopassport库,以便我可以使用 session in socket.io,库是 call passport-socket.io。所以要在 socket.io 中获取用户 ID 将是

socket.request.user._id
Run Code Online (Sandbox Code Playgroud)

Nij*_*esh 5

我为此所做的是维护一个包含已连接用户的 userId 和 socketId 的数据库模型(我使用的是猫鼬)。你甚至可以用一个全局数组来做到这一点。从套接字连接的客户端,与 userId 一起发出事件

socket.on('connect', function() {
    socket.emit('connected', userName); //userName is unique
})
Run Code Online (Sandbox Code Playgroud)

在服务器端,

var Connect = require('mongoose').model('connect');; /* connect is mongoose model i used to store currently connected users info*/
socket.on('connected', function(user) { // add user data on connection
    var c=new Connect({
        socketId : socket.id,
        client : user
    })
    c.save(function (err, data) {
        if (err) console.log(err);
    });
})
socket.on('disconnect', function() { //remove user data from model when a socket disconnects
    Connect.findOne({socketId : socket.id}).remove().exec(); 
})
Run Code Online (Sandbox Code Playgroud)

这种方式始终存储已连接的用户信息(当前使用的 socketId)。每当您需要获取用户当前的 socketId 时,将其获取为

Connect.findOne({client : userNameOfUserToFind}).exec(function(err,res) {
    if(res!=null)
        io.to(res.socketId).emit('my message', msg);
})
Run Code Online (Sandbox Code Playgroud)

我在这里使用了猫鼬,但您甚至可以在这里使用数组并使用过滤器从数组中获取用户的 socketId。