1

我正在尝试使用 express-ws 为 express 启用 websocket。我有两个快递服务器,都使用 ws。两个服务器的 ws 设置代码完全相同(路径名除外)。其中一台服务器按预期工作。另一个,一旦与退出代码 1005 建立连接就关闭。据我研究,我发现 1005 被描述为在意外断开连接的情况下返回的特殊错误代码。我尝试在 ws 路由处理程序中登录,但它什么也没打印。在“连接”处理程序也不会被触发。

const expressWs = require('express-ws')(server, null { wsOptions: { clientTracking: true } });
//<... HTTP route setup and middleware mounting >
server.ws('/',(sck, req)=> {
    sck.on('connection', (s1) => {
       console.dir(s1);
       console.log('Connected')
    });
    let interval = setInterval(() => {
      expressWs.getWss().clients.forEach(s => {
        if(s.readyState === WS_CONSTANTS.Open) {
            s.ping(null, false, null);
        }
      });
    }, WS_HEARTBEAT_DELAY);
   sck.on('close', (ev) => {
      console.dir(ev);
      clearInterval(interval);
   });
//<... Other code for route handling >

如您所见,我实现了一种“心跳”技术,用于向客户端发送 ping 以保持连接处于活动状态。如前所述,它仅适用于其中一台服务器。我对为什么返回 1005 感到非常困惑。

编辑 1

在此帖子之后我尝试手动更新 express-ws 的 ws 包。这仍然没有解决问题,并且如前所述,连接仍然以 1005 断开。

4

1 回答 1

1

好的,我终于找到了错误。在我的服务器代码中,我有以下内容:

server.get('*', async (req, res, nxt) => {
   nxt(new Error('Unsupported Method'));
});

我这样做是为了防止处理任何获取请求,因为 API 仅依赖于发布路由。我将其更改为以下内容:

server.get('*', async (req, res, nxt) => {
    nxt();
});

这解决了问题。恕我直言,我认为 ws“升级”发生在 GET 上,并以错误响应获取请求阻止了任何升级请求。此外,我确保另一台服务器没有这样的阻塞,这就是为什么我最初认为两台服务器都具有相同的设置,这让我感到困惑。希望这会有所帮助。

于 2019-03-25T11:45:09.760 回答