【问题标题】:async function as handler for socketio listener异步函数作为 socketio 侦听器的处理程序
【发布时间】:2020-01-11 08:16:11
【问题描述】:

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

总之就是这段代码

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

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

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

【问题讨论】:

    标签: javascript socket.io


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      我知道实现这一目标的两种方法。一种是将你的异步函数变成同步函数。

      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.
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-22
        • 2017-03-02
        • 2012-06-21
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 2019-01-13
        相关资源
        最近更新 更多