javascript - 异步函数作为 socketio 监听器的处理程序

标签 javascript socket.io

我正在尝试构建对 socketio websockets 的身份验证,但遇到了涉及身份验证 token 设置的问题。问题归结为以下几点:我用来获取最新身份验证 token 的函数是异步的,但似乎为 socketio 监听器提供了一个 async 函数>“reconnect_attempt”事件在尝试重新连接之前不会等待函数返回。

简而言之,这段代码

socket.on("reconnect_attempt", async () => {
    const token = await getIdToken();
    socket.io.opts.query = { token };
});

在重新连接请求发送到服务器之前,实际上并没有设置套接字的query.token。因此,当 token 过期后重新连接时,会在获取新 token 的同时发送过期 token 。

有没有办法以某种方式配置socketio,以便它在实际触发重新连接请求之前等待监听器的处理程序函数返回?如果没有,我想我将不得不主动刷新 token 并将其存储在应用程序中的某个位置,但我很好奇这是否可能。

最佳答案

看起来“reconnect_attempt”回调实际上并没有中断正在发出的请求,但它只是允许您在尝试时进行监听。相反,您可以将 socketio 连接设置为根本不自动重新连接并订阅断开事件。然后,正确处理 token 生成并从那里发起新请求。

const socket = io({
  autoConnect: false
});

// socket.disconnected is a boolean to tell you if the connect is up or down
socket.on('connect', () => {
  console.log(socket.disconnected); // false
});

https://socket.io/docs/client-api/#Event-%E2%80%98reconnect-attempt%E2%80%99-1

关于javascript - 异步函数作为 socketio 监听器的处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59689253/

相关文章:

javascript - 在 Firebase 中删除用户时如何获取 authData?

javascript - 特定字段的表单滚动条

javascript - 你将如何在 React 中的组件之间传输数据?

javascript - 无法让 Angular 过滤器显示 Html 实体

javascript - 我可以使用 python 连接到 https websocket 吗?

python - SocketIO + Flask 检测断线

javascript - 如何使用 javascript 命令在 jw player 中获取源 url

node.js - 使用 Socket.IO,如何找出断开连接的用户的 session ID?

javascript - 在其他范围内执行 Angular 服务?

node.js - 试图理解 Socket.IO - 套接字和发射