首页 > 解决方案 > 在 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() 中传递数据?

标签: javascriptsocketssocket.io

解决方案


使用 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 存储数据


推荐阅读