【问题标题】:How to send http responses to all the connected sockets with fastify-ws in node.js application?如何在 node.js 应用程序中使用 fastify-ws 向所有连接的套接字发送 http 响应?
【发布时间】:2020-06-22 08:20:39
【问题描述】:

我在 node.js 应用程序中为 WebSocket 使用“fastify-ws”。我也在同一个端口中使用 HTTP 通信。我必须通过 WebSocket 将 HTTP 响应发送到连接的套接字。

这是我的示例代码:

var connectedSockets = [];

function socketConnect(socket, req) {
  console.log('Client connected');
  connectedSockets.push(socket);

  socket.on('close', () => {
    console.log('websocket closed');
    connectedSockets = connectedSockets.filter((sk) => sk !== socket);
    });
}

module.exports = { connectedSockets, socketConnect };

如果连接了任何客户端,我会将套接字推送到 connectedSockets 数组中,并在关闭时从数组中删除特定的套接字。然后我将通过 WebSockets 在另一个文件中发送如下 HTTP 响应。

const { connectedSockets } = require('../controllers');

// inside response

connectedSockets.forEach((socket) => {
            socket.send(JSON.stringify(response));
        });

这样就可以连接客户端了。我可以成功发送回复。如果连接了多个客户端并且关闭了一个客户端,则会在发送响应时引发类似“WebSocket 未打开就绪状态 3 (CLOSED)”的错误。问题是断开连接的套接字对象仍然在 connectedSockets 数组中,并且它有一个属性 _closedFrameReceived: true。

【问题讨论】:

    标签: node.js sockets websocket fastify


    【解决方案1】:

    您的脚本的问题是您有 2 个文件:

    • 文件 A 和 connectedSockets 指向一个数组

    • 带有connectedSockets 的文件B 指向文件A 的connectedSockets

    当你这样做时

    connectedSockets = connectedSockets.filter((sk) => sk !== socket);
    

    您只更改了文件 A 的 connectedSockets 的指针,而文件 B 的指针未更新,它链接旧数组。

    你应该像这样改变数组:

    const index = connectedSockets.findIndex((sk) => sk === socket);
    if (index > -1) {
      connectedSockets.splice(index, 1);
    }
    

    或者更新文件 B 中的 var。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 2016-06-14
      • 2013-03-29
      • 2021-09-03
      • 2013-07-23
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多