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.io
和passport
库,以便我可以使用 session in socket.io
,库是 call passport-socket.io
。所以要在 socket.io 中获取用户 ID 将是
socket.request.user._id
Run Code Online (Sandbox Code Playgroud)
我为此所做的是维护一个包含已连接用户的 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。