我如何获得其他用户socket.id?

时间:2016-01-27 17:36:49

标签: node.js express socket.io

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

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

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

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

但问题是如何获得该ID?

让Jack说要向Jonah发送消息

杰克会使用上面的代码发送消息,但是如何获取Jonah的套接字ID?

为了记录,我已经实施了socket.iopassport库,以便我可以在socket.io中使用会话,该库名为passport-socket.io。所以在socket.io中获取用户id将是

socket.request.user._id

2 个答案:

答案 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); }); });