node.js - 在数据库中按 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 文档中,并在每次连接时刷新它或将其存储在用户会话中,并在每次用户刷新时更新它。
解决方案
将套接字保存在一个数组中,并将 .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
}
})
})
推荐阅读
- node.js - 如何跟踪和减少 puppeteer 数据的使用?
- java - 如何在没有 root 的情况下删除或强制锁定特定的 android 系统活动?
- python - opencv图像预处理以仅从图像中获取文本和数字
- postgresql - 如何为外汇数据分区postgresql表
- python-3.x - IndexError:python3脚本中的列表索引超出范围
- c# - 安装 Unity DOTS 包后出错
- python - 用opencv拼接2个视频
- php - 不确定获取所有寄存器或尝试将它们存储在redis上
- html - 将 html 文件放入 docker 映像并运行容器
- django - 列 ID 不存在 Heroku