首页 > 解决方案 > 在数据库中按 ID 查找用户 socket.io 套接字 id

问题描述

基本上我正在运行一个带有 socket.io 和 passport.js 的 web 应用程序,并将 mongodb 作为数据库。我需要向某个用户发送数据,这是通过用户 socket.id 发送来完成的,但是套接字 id 每次刷新都会改变,所以我需要每次都能再次获取它并将其保存在某个地方。我想知道在通过用户 mongo ID 搜索时是否有一种简单的方法来获取用户 socket.id。这里提到了这样的事情

passportSocketIo.filterSocketsByUser(io, function(user){
return user.gender === 'female';
}).forEach(function(socket){
socket.emit('messsage', 'hello, woman!');
});

然而这个库现在已经没用了,因为它所做的大部分工作都被添加到了 socket.io。我能够找到类似的东西

io.emitToUser = (_id, event, ...args) =>
io.filterSocketsByUser(user => user._id.equals(_id)).forEach(socket => socket.emit(event, ...args))

但我无法让它工作。有没有一种简单的方法可以通过数据库名称获取用户套接字 ID。目前我能想到的就是将它添加到用户的 mongo 文档中,并在每次连接时刷新它或将其存储在用户会话中,并在每次用户刷新时更新它。

标签: node.jsarraysmongodbwebsocketsocket.io

解决方案


将套接字保存在一个数组中,并将 .auth 和 .user 属性添加到套接字本身。然后您可以搜索任何用户的当前 socket.id 以及身份验证状态。

const clients = []

io.on('connection', (socket) => {
    clients.push(socket)
    socket.on('auth', ( msg , callback )=>{
        // get session info
        if( session.passport && session.passport.user){
            socket.auth = true
            socket.user = session.passport.user
        }
    })
     
})

推荐阅读