如何获得其他用户的socket.id?
由于socket.id不断变化,每当浏览器刷新或断开连接时再重新连接。
例如,这行代码将解决我的问题
socket.broadcast.to(id).emit('my message', msg);
但问题是如何获得该ID?
让Jack说要向Jonah发送消息
杰克会使用上面的代码发送消息,但是如何获取Jonah的套接字ID?
为了记录,我已经实施了socket.io
和passport
库,以便我可以在socket.io
中使用会话,该库名为passport-socket.io
。所以在socket.io中获取用户id将是
socket.request.user._id
答案 0 :(得分:3)
我为此做的是维护一个包含连接用户的userId和socketId的数据库模型(我使用的是mongoose)。您甚至可以使用全局数组执行此操作。从套接字连接的客户端,与userId
一起发出事件socket.on('connect', function() {
socket.emit('connected', userName); //userName is unique
})
在服务器端,
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();
})
这种方式始终存储已连接的用户信息(当前使用的socketId)。每当你需要得到一个用户当前的socketId获取它
Connect.findOne({client : userNameOfUserToFind}).exec(function(err,res) {
if(res!=null)
io.to(res.socketId).emit('my message', msg);
})
我在这里使用了mongoose,但你甚至可以在这里使用数组并使用过滤器从数组中获取用户的socketId。
答案 1 :(得分:0)
文档建议`socket.on(SOME_MESSAGE的回调提供了一个id作为第一个参数。
http://socket.io/docs/rooms-and-namespaces/#default-room
javascript
io.on('connection', function(socket){
socket.on('say to someone', function(id, msg){
socket.broadcast.to(id).emit('my message', msg);
});
});