javascript - 在 socket.io 中调用 socket.connect() 时如何传递附加数据?
问题描述
我正在尝试找到一种在用户单击登录时连接到套接字时传递其他数据(例如用户名,avatar_url)的方法。例子:
const logIn = ({ username, avatar }) => {
socket.auth = { username };
socket.connect({ query: { username: username, avatar: avatar } });
}
在服务器端:
io.use((socket, next) => {
console.log("===> Data:", socket.request._query);
});
但是我没有得到用户名和头像字段的任何键值。我尝试搜索文档,但找不到与传递数据有关的 socket.connect() 的任何信息。
如何在 socket.connect() 中传递数据?
解决方案
使用 JWT 并将该数据作为对象的一部分传递。
因此,流程将是,当您“身份验证”时,它会将带有 avitar 等的 JWT 发回。
当您将其发送到服务器并解码令牌时,您可以将其设置为套接字对象的一部分
举个例子(我们目前使用的是 jsonwebtoken 包)
// verify token
jwt.verify(token, '[password]', (err, decoded) => {
try{
/* connecting */
socket.avitar = decoded.avitar;
socket.nickname = "nick name";
if(err) return next(err);
//('success!')
然后你可以在发射时访问它,因为套接字 ID 对用户来说是唯一的,它应该保存值,如果他们断开/重新连接,令牌仍将包含这些值。
在集群模式下,使用 redis socket.io 并将其作为 hset 传入,以使用 socketID 存储数据
推荐阅读
- python - 如何将触发器类型作为有效负载传递给云构建中的“方法:projects.triggers.create”
- java - 为什么不推荐 @Autowired 和 @Inject on field 但 @Resoruce 在 Spring/IntelliJ 中很好
- css - Codeigniter CSS、JS 和图像未加载,可能假定为目录
- amazon-web-services - 从 Dynamodb AWS 中的表中获取项目
- google-chrome - 在 Chrome 中输入错误的密码,不再弹出登录对话框
- flutter - Flutter StatefulWidget with parameters
- encryption - 使用 xmlCipher.doFinal() 解密 SAML 响应时未获得解密密码数据的预期结果
- jquery - 使用 jquery 设置和获取 html 标记值
- c++ - 从 .SVG 文件创建后 QIcon null
- azure - 我们如何在 datafactory 中创建一个通用的映射数据流,它将动态地从具有不同模式的不同表中提取数据?