尝试在页面之间保持 socket.io 连接相同。是否有一个框架可以让我这样做?

Trying to keep socket.io connection same between pages. Is there a framework that would allow me to do this?

我正在创建一个使用 Socket.io 连接进行实时更新的 Express 应用程序。即使用户切换页面,我也想保持 Socket.io 连接。看到这似乎不可能,我想知道是否有一些框架允许您拥有一个 .html 页面并基于该模板生成页面(就像 Angular 那样它)。 Express 是否存在这样的框架?我查看了 Vue,但不确定它是否有效。

我目前正在向用户发送静态 html 文件。非常感谢任何对此问题的帮助。

提前致谢!

有一种方法可以访问请求中的 socket.io 实例。

首先创建套接字-io.js 文件:

const socketio = require('socket.io');
module.exports.io = (server) => {
   const io = socketio(server);
   io.on('connection', async function (socket, next) {
   });

   return io;
};

然后将其导入 app.js 文件:

const { createServer } = require('http');

const socketio = require('./services/socket_io').io;
const server = createServer(app);

const io = socketio(server);
app.use((req, res, next) => {
   // instance socketio to req object
   req.socket = io;
   next();
});

通过此配置,您可以在每个请求中使用套接字 io 实例。

req.socket.emit("my_event", event)

我不会详细介绍 html 和 css 文件,因为没有必要。主页或父页面 (index.html) 只需要这个 javascript 文件来建立 socket.io-客户端连接。

var io = io();

function get_socket() {
    console.log("Return socket connection to iframe page");
    return io;
}

// handles server telling client to change page url in iframe
io.on("page", (page) => {
    $("#iframepage").attr("src", page);
    console.log("Page change: " + page);
});

在 html 文件中,我包含 jQuery 和 socket.io-client。

当 iframe 加载 javascript 文件时,它们可以为套接字连接调用父页面,就像:

var socket = parent.get_socket();

当 iframe 更改时,所有 .on 命令都会刷新。这对于单页应用程序和在 tab/browser 或应用程序关闭时登录非常有用,即使服务器可以捕获断开连接事件。

我从未尝试过这个,但您可以从 Service Worker 建立 WebSocket 连接,然后让打开的页面与工作人员通信。

粗略看来,过去的浏览器似乎不支持 worker 中的 WebSockets,但这在几年前就已修复。如果没有打开的页面,您可以指望浏览器最终会杀死您的工作人员(并因此终止套接字连接),看起来有些浏览器可能会这样做,即使仍然有页面打开,所以您可能需要试验看看这种方法是否对你来说足够可靠。