异步函数作为socketio侦听器的处理程序

时间:2020-01-10 21:28:22

标签: javascript socket.io

我正在尝试建立对socketio websocket的身份验证,但是遇到了涉及设置身份验证令牌的问题。问题归结为以下原因:我用来获取最新身份验证令牌的函数是异步的,但似乎为async的socketio侦听器提供了"reconnect_attempt"函数事件在尝试重新连接之前不会等待函数返回。

简而言之,这段代码

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

在重新连接请求发送到服务器之前,实际上没有设置套接字的query.token。这样,当令牌过期后发生重新连接时,将在获取新令牌的同时发送过期的令牌。

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

2 个答案:

答案 0 :(得分:0)

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

JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=$HTTP_HOST --sessionTimeout=$SESSION_TIMEOUT"

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

答案 1 :(得分:0)

我知道两种方法可以实现这一目标。一种是将您的异步功能转变为同步功能。

function wait_for(promise) {
  let ret, done;
  promise.then(r => {ret = r, done = true});
  while (!done) {}
  return ret
}

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

另一种方法是禁用reconnection,并手动处理重新连接。

socket.reconnection(False);
socket.on("disconnect", async () => {
    const token = await getIdToken();
    socket.io.opts.query = { token };
    socket.open()
    // implement reconnect attempt limit, delay and such.
});